kernel: bump 4.14 to 4.14.48 for 18.06
Refreshed patches. The following patches were upstreamed and have been deleted: * target/linux/lantiq/patches-4.14/0025-MIPS-lantiq-gphy-Remove-reboot-remove-reset-asserts.patch * target/linux/generic/pending-4.14/101-clocksource-mips-gic-timer-fix-clocksource-counter-w.patch * target/linux/generic/pending-4.14/103-MIPS-c-r4k-fix-data-corruption-related-to-cache-coherence.patch * target/linux/generic/pending-4.14/181-net-usb-add-lte-modem-wistron-neweb-d18q1.patch Compile-tested: ramips/mt7621, x86/64 Run-tested: ramips/mt7621 Signed-off-by: Stijn Segers <foss@volatilesystems.org>
This commit is contained in:
		 Stijn Segers
					Stijn Segers
				
			
				
					committed by
					
						 John Crispin
						John Crispin
					
				
			
			
				
	
			
			
			 John Crispin
						John Crispin
					
				
			
						parent
						
							6f8eb1b50f
						
					
				
				
					commit
					1199a91095
				
			| @@ -5,12 +5,12 @@ LINUX_RELEASE?=1 | ||||
| LINUX_VERSION-3.18 = .71 | ||||
| LINUX_VERSION-4.4 = .121 | ||||
| LINUX_VERSION-4.9 = .106 | ||||
| LINUX_VERSION-4.14 = .43 | ||||
| LINUX_VERSION-4.14 = .48 | ||||
|  | ||||
| LINUX_KERNEL_HASH-3.18.71 = 5abc9778ad44ce02ed6c8ab52ece8a21c6d20d21f6ed8a19287b4a38a50c1240 | ||||
| LINUX_KERNEL_HASH-4.4.121 = 44a88268b5088dc326b30c9b9133ac35a9a200b636b7268d08f32abeae6ca729 | ||||
| LINUX_KERNEL_HASH-4.9.106 = 2d409bb29588ea9a61bae006255ee97a675ded364c87a9ff43f687c5271bbe3c | ||||
| LINUX_KERNEL_HASH-4.14.43 = 133fc0f8f9ea04006c255a052704e8eb95a021fc799dd27f98fcfcace59e714a | ||||
| LINUX_KERNEL_HASH-4.14.48 = 80a0608f611fe7a5c54556402cdc2880a21301e1c4e1b19d4c1db82ad2bf22b9 | ||||
|  | ||||
| remove_uri_prefix=$(subst git://,,$(subst http://,,$(subst https://,,$(1)))) | ||||
| sanitize_uri=$(call qstrip,$(subst @,_,$(subst :,_,$(subst .,_,$(subst -,_,$(subst /,_,$(1))))))) | ||||
|   | ||||
| @@ -44,7 +44,7 @@ Signed-off-by: Christian Lamparter <chunkeey@googlemail.com> | ||||
|   | ||||
|  #include "xhci.h" | ||||
|  #include "xhci-trace.h" | ||||
| @@ -244,6 +246,458 @@ static void xhci_pme_acpi_rtd3_enable(st | ||||
| @@ -255,6 +257,458 @@ static void xhci_pme_acpi_rtd3_enable(st | ||||
|  static void xhci_pme_acpi_rtd3_enable(struct pci_dev *dev) { } | ||||
|  #endif /* CONFIG_ACPI */ | ||||
|   | ||||
| @@ -503,7 +503,7 @@ Signed-off-by: Christian Lamparter <chunkeey@googlemail.com> | ||||
|  /* called during probe() after chip reset completes */ | ||||
|  static int xhci_pci_setup(struct usb_hcd *hcd) | ||||
|  { | ||||
| @@ -279,6 +733,22 @@ static int xhci_pci_probe(struct pci_dev | ||||
| @@ -290,6 +744,22 @@ static int xhci_pci_probe(struct pci_dev | ||||
|  	struct hc_driver *driver; | ||||
|  	struct usb_hcd *hcd; | ||||
|   | ||||
| @@ -526,7 +526,7 @@ Signed-off-by: Christian Lamparter <chunkeey@googlemail.com> | ||||
|  	driver = (struct hc_driver *)id->driver_data; | ||||
|   | ||||
|  	/* For some HW implementation, a XHCI reset is just not enough... */ | ||||
| @@ -343,6 +813,16 @@ static void xhci_pci_remove(struct pci_d | ||||
| @@ -354,6 +824,16 @@ static void xhci_pci_remove(struct pci_d | ||||
|  { | ||||
|  	struct xhci_hcd *xhci; | ||||
|   | ||||
|   | ||||
| @@ -13,7 +13,7 @@ produce a noisy warning. | ||||
|  | ||||
| --- a/drivers/usb/host/xhci-pci.c | ||||
| +++ b/drivers/usb/host/xhci-pci.c | ||||
| @@ -202,7 +202,7 @@ static void xhci_pci_quirks(struct devic | ||||
| @@ -213,7 +213,7 @@ static void xhci_pci_quirks(struct devic | ||||
|  		xhci->quirks |= XHCI_TRUST_TX_LENGTH; | ||||
|  	if (pdev->vendor == PCI_VENDOR_ID_RENESAS && | ||||
|  			pdev->device == 0x0015) | ||||
|   | ||||
| @@ -129,7 +129,7 @@ it on BCM4708 family. | ||||
| +++ b/drivers/usb/host/xhci.h | ||||
| @@ -1831,6 +1831,7 @@ struct xhci_hcd { | ||||
|  #define XHCI_LIMIT_ENDPOINT_INTERVAL_7	(1 << 26) | ||||
|  /* Reserved. It was XHCI_U2_DISABLE_WAKE */ | ||||
|  #define XHCI_U2_DISABLE_WAKE	(1 << 27) | ||||
|  #define XHCI_ASMEDIA_MODIFY_FLOWCONTROL	(1 << 28) | ||||
| +#define XHCI_FAKE_DOORBELL	(1 << 29) | ||||
|  #define XHCI_SUSPEND_DELAY	(1 << 30) | ||||
|   | ||||
| @@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  | ||||
| --- a/Makefile | ||||
| +++ b/Makefile | ||||
| @@ -433,8 +433,8 @@ KBUILD_CFLAGS_MODULE  := -DMODULE | ||||
| @@ -428,8 +428,8 @@ KBUILD_CFLAGS_MODULE  := -DMODULE | ||||
|  KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds | ||||
|  GCC_PLUGINS_CFLAGS := | ||||
|   | ||||
|   | ||||
| @@ -26,7 +26,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> | ||||
|   | ||||
|  /* | ||||
|   *	IEEE 802.3 Ethernet magic constants.  The frame sizes omit the preamble | ||||
| @@ -149,11 +150,13 @@ | ||||
| @@ -150,11 +151,13 @@ | ||||
|   *	This is an Ethernet frame header. | ||||
|   */ | ||||
|   | ||||
|   | ||||
| @@ -11,7 +11,7 @@ Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org> | ||||
|  | ||||
| --- a/net/ipv4/netfilter/ipt_CLUSTERIP.c | ||||
| +++ b/net/ipv4/netfilter/ipt_CLUSTERIP.c | ||||
| @@ -829,6 +829,7 @@ static void clusterip_net_exit(struct ne | ||||
| @@ -834,6 +834,7 @@ static void clusterip_net_exit(struct ne | ||||
|  	cn->procdir = NULL; | ||||
|  #endif | ||||
|  	nf_unregister_net_hook(net, &cip_arp_ops); | ||||
|   | ||||
| @@ -13,7 +13,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  | ||||
| --- a/Makefile | ||||
| +++ b/Makefile | ||||
| @@ -430,7 +430,7 @@ KBUILD_AFLAGS_KERNEL := | ||||
| @@ -425,7 +425,7 @@ KBUILD_AFLAGS_KERNEL := | ||||
|  KBUILD_CFLAGS_KERNEL := | ||||
|  KBUILD_AFLAGS_MODULE  := -DMODULE | ||||
|  KBUILD_CFLAGS_MODULE  := -DMODULE | ||||
|   | ||||
| @@ -15,7 +15,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  | ||||
| --- a/Makefile | ||||
| +++ b/Makefile | ||||
| @@ -1233,7 +1233,6 @@ all: modules | ||||
| @@ -1227,7 +1227,6 @@ all: modules | ||||
|   | ||||
|  PHONY += modules | ||||
|  modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) modules.builtin | ||||
| @@ -23,7 +23,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  	@$(kecho) '  Building modules, stage 2.'; | ||||
|  	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost | ||||
|   | ||||
| @@ -1262,7 +1261,6 @@ _modinst_: | ||||
| @@ -1256,7 +1255,6 @@ _modinst_: | ||||
|  		rm -f $(MODLIB)/build ; \ | ||||
|  		ln -s $(CURDIR) $(MODLIB)/build ; \ | ||||
|  	fi | ||||
|   | ||||
| @@ -33,7 +33,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org> | ||||
|  # Read KERNELRELEASE from include/config/kernel.release (if it exists) | ||||
|  KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null) | ||||
|  KERNELVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION) | ||||
| @@ -787,11 +792,6 @@ ifdef CONFIG_DEBUG_SECTION_MISMATCH | ||||
| @@ -781,11 +786,6 @@ ifdef CONFIG_DEBUG_SECTION_MISMATCH | ||||
|  KBUILD_CFLAGS += $(call cc-option, -fno-inline-functions-called-once) | ||||
|  endif | ||||
|   | ||||
|   | ||||
| @@ -32,7 +32,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> | ||||
|  #include <linux/bcm47xx_nvram.h> | ||||
|  #include <linux/phy.h> | ||||
|  #include <linux/phy_fixed.h> | ||||
| @@ -1409,6 +1410,17 @@ static const struct ethtool_ops bgmac_et | ||||
| @@ -1410,6 +1411,17 @@ static const struct ethtool_ops bgmac_et | ||||
|  	.set_link_ksettings     = phy_ethtool_set_link_ksettings, | ||||
|  }; | ||||
|   | ||||
| @@ -50,7 +50,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> | ||||
|  /************************************************** | ||||
|   * MII | ||||
|   **************************************************/ | ||||
| @@ -1538,6 +1550,14 @@ int bgmac_enet_probe(struct bgmac *bgmac | ||||
| @@ -1539,6 +1551,14 @@ int bgmac_enet_probe(struct bgmac *bgmac | ||||
|  	net_dev->hw_features = net_dev->features; | ||||
|  	net_dev->vlan_features = net_dev->features; | ||||
|   | ||||
| @@ -65,7 +65,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> | ||||
|  	err = register_netdev(bgmac->net_dev); | ||||
|  	if (err) { | ||||
|  		dev_err(bgmac->dev, "Cannot register net device\n"); | ||||
| @@ -1560,6 +1580,10 @@ EXPORT_SYMBOL_GPL(bgmac_enet_probe); | ||||
| @@ -1561,6 +1581,10 @@ EXPORT_SYMBOL_GPL(bgmac_enet_probe); | ||||
|   | ||||
|  void bgmac_enet_remove(struct bgmac *bgmac) | ||||
|  { | ||||
|   | ||||
| @@ -66,7 +66,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  static void __sk_free(struct sock *sk) | ||||
|  { | ||||
| +#ifdef CONFIG_SOCK_DIAG | ||||
|  	if (unlikely(sock_diag_has_destroy_listeners(sk) && sk->sk_net_refcnt)) | ||||
|  	if (unlikely(sk->sk_net_refcnt && sock_diag_has_destroy_listeners(sk))) | ||||
|  		sock_diag_broadcast_destroy(sk); | ||||
|  	else | ||||
| +#endif | ||||
|   | ||||
| @@ -243,7 +243,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  } | ||||
| --- a/mm/vmstat.c | ||||
| +++ b/mm/vmstat.c | ||||
| @@ -1944,10 +1944,12 @@ void __init init_mm_internals(void) | ||||
| @@ -1946,10 +1946,12 @@ void __init init_mm_internals(void) | ||||
|  	start_shepherd_timer(); | ||||
|  #endif | ||||
|  #ifdef CONFIG_PROC_FS | ||||
|   | ||||
| @@ -1,23 +0,0 @@ | ||||
| From: Felix Fietkau <nbd@nbd.name> | ||||
| Date: Wed, 21 Feb 2018 13:40:12 +0100 | ||||
| Subject: [PATCH] clocksource: mips-gic-timer: fix clocksource counter width | ||||
|  | ||||
| This code needs to use ffs instead of fls on the mask to determine the | ||||
| shift for reading the GIC_CONFIG_COUNTBITS field. | ||||
|  | ||||
| Fixes: e07127a077c7 ("clocksource: mips-gic-timer: Use new GIC accessor functions") | ||||
| Cc: Paul Burton <paul.burton@imgtec.com> | ||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| --- | ||||
|  | ||||
| --- a/drivers/clocksource/mips-gic-timer.c | ||||
| +++ b/drivers/clocksource/mips-gic-timer.c | ||||
| @@ -164,7 +164,7 @@ static int __init __gic_clocksource_init | ||||
|   | ||||
|  	/* Set clocksource mask. */ | ||||
|  	count_width = read_gic_config() & GIC_CONFIG_COUNTBITS; | ||||
| -	count_width >>= __fls(GIC_CONFIG_COUNTBITS); | ||||
| +	count_width >>= __ffs(GIC_CONFIG_COUNTBITS); | ||||
|  	count_width *= 4; | ||||
|  	count_width += 32; | ||||
|  	gic_clocksource.mask = CLOCKSOURCE_MASK(count_width); | ||||
| @@ -1,90 +0,0 @@ | ||||
| From patchwork Thu Apr 26 23:28:34 2018 | ||||
| Content-Type: text/plain; charset="utf-8" | ||||
| MIME-Version: 1.0 | ||||
| Content-Transfer-Encoding: 7bit | ||||
| Subject: [v2] MIPS: c-r4k: fix data corruption related to cache coherence. | ||||
| X-Patchwork-Submitter: NeilBrown <neil@brown.name> | ||||
| X-Patchwork-Id: 19259 | ||||
| Message-Id: <87vacdlf8d.fsf@notabene.neil.brown.name> | ||||
| To: James Hogan <jhogan@kernel.org> | ||||
| Cc: Ralf Baechle <ralf@linux-mips.org>, | ||||
|  Paul Burton <paul.burton@mips.com>, linux-mips@linux-mips.org, | ||||
|  linux-kernel@vger.kernel.org | ||||
| Date: Fri, 27 Apr 2018 09:28:34 +1000 | ||||
| From: NeilBrown <neil@brown.name> | ||||
| List-Id: linux-mips <linux-mips.eddie.linux-mips.org> | ||||
|  | ||||
| When DMA will be performed to a MIPS32 1004K CPS, the | ||||
| L1-cache for the range needs to be flushed and invalidated | ||||
| first. | ||||
| The code currently takes one of two approaches. | ||||
| 1/ If the range is less than the size of the dcache, then | ||||
|    HIT type requests flush/invalidate cache lines for the | ||||
|    particular addresses.  HIT-type requests a globalised | ||||
|    by the CPS so this is safe on SMP. | ||||
|  | ||||
| 2/ If the range is larger than the size of dcache, then | ||||
|    INDEX type requests flush/invalidate the whole cache. | ||||
|    INDEX type requests affect the local cache only. CPS | ||||
|    does not propagate them in any way.  So this invalidation | ||||
|    is not safe on SMP CPS systems. | ||||
|  | ||||
| Data corruption due to '2' can quite easily be demonstrated by | ||||
| repeatedly "echo 3 > /proc/sys/vm/drop_caches" and then sha1sum | ||||
| a file that is several times the size of available memory. | ||||
| Dropping caches means that large contiguous extents (large than | ||||
| dcache) are more likely. | ||||
|  | ||||
| This was not a problem before Linux-4.8 because option 2 was | ||||
| never used if CONFIG_MIPS_CPS was defined.  The commit | ||||
| which removed that apparently didn't appreciate the full | ||||
| consequence of the change. | ||||
|  | ||||
| We could, in theory, globalize the INDEX based flush by sending an IPI | ||||
| to other cores.  These cache invalidation routines can be called with | ||||
| interrupts disabled and synchronous IPI require interrupts to be | ||||
| enabled.  Asynchronous IPI may not trigger writeback soon enough. | ||||
| So we cannot use IPI in practice. | ||||
|  | ||||
| We can already test is IPI would be needed for an INDEX operation | ||||
| with r4k_op_needs_ipi(R4K_INDEX).  If this is True then we mustn't try | ||||
| the INDEX approach as we cannot use IPI.  If this is False (e.g. when | ||||
| there is only one core and hence one L1 cache) then it is safe to | ||||
| use the INDEX approach without IPI. | ||||
|  | ||||
| This patch avoids options 2 if r4k_op_needs_ipi(R4K_INDEX), and so | ||||
| eliminates the corruption. | ||||
|  | ||||
| Fixes: c00ab4896ed5 ("MIPS: Remove cpu_has_safe_index_cacheops") | ||||
| Cc: stable@vger.kernel.org # v4.8+ | ||||
| Signed-off-by: NeilBrown <neil@brown.name> | ||||
| --- | ||||
|  arch/mips/mm/c-r4k.c | 9 ++++++--- | ||||
|  1 file changed, 6 insertions(+), 3 deletions(-) | ||||
|  | ||||
| --- a/arch/mips/mm/c-r4k.c | ||||
| +++ b/arch/mips/mm/c-r4k.c | ||||
| @@ -851,9 +851,12 @@ static void r4k_dma_cache_wback_inv(unsi | ||||
|  	/* | ||||
|  	 * Either no secondary cache or the available caches don't have the | ||||
|  	 * subset property so we have to flush the primary caches | ||||
| -	 * explicitly | ||||
| +	 * explicitly. | ||||
| +	 * If we would need IPI to perform an INDEX-type operation, then | ||||
| +	 * we have to use the HIT-type alternative as IPI cannot be used | ||||
| +	 * here due to interrupts possibly being disabled. | ||||
|  	 */ | ||||
| -	if (size >= dcache_size) { | ||||
| +	if (!r4k_op_needs_ipi(R4K_INDEX) && size >= dcache_size) { | ||||
|  		r4k_blast_dcache(); | ||||
|  	} else { | ||||
|  		R4600_HIT_CACHEOP_WAR_IMPL; | ||||
| @@ -890,7 +893,7 @@ static void r4k_dma_cache_inv(unsigned l | ||||
|  		return; | ||||
|  	} | ||||
|   | ||||
| -	if (size >= dcache_size) { | ||||
| +	if (!r4k_op_needs_ipi(R4K_INDEX) && size >= dcache_size) { | ||||
|  		r4k_blast_dcache(); | ||||
|  	} else { | ||||
|  		R4600_HIT_CACHEOP_WAR_IMPL; | ||||
| @@ -8,7 +8,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  | ||||
| --- a/fs/jffs2/dir.c | ||||
| +++ b/fs/jffs2/dir.c | ||||
| @@ -756,6 +756,24 @@ static int jffs2_mknod (struct inode *di | ||||
| @@ -752,6 +752,24 @@ static int jffs2_mknod (struct inode *di | ||||
|  	return ret; | ||||
|  } | ||||
|   | ||||
| @@ -33,7 +33,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry, | ||||
|  			 struct inode *new_dir_i, struct dentry *new_dentry, | ||||
|  			 unsigned int flags) | ||||
| @@ -766,7 +784,7 @@ static int jffs2_rename (struct inode *o | ||||
| @@ -762,7 +780,7 @@ static int jffs2_rename (struct inode *o | ||||
|  	uint8_t type; | ||||
|  	uint32_t now; | ||||
|   | ||||
| @@ -42,7 +42,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  		return -EINVAL; | ||||
|   | ||||
|  	/* The VFS will check for us and prevent trying to rename a | ||||
| @@ -832,9 +850,14 @@ static int jffs2_rename (struct inode *o | ||||
| @@ -828,9 +846,14 @@ static int jffs2_rename (struct inode *o | ||||
|  	if (d_is_dir(old_dentry) && !victim_f) | ||||
|  		inc_nlink(new_dir_i); | ||||
|   | ||||
|   | ||||
| @@ -6,7 +6,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  | ||||
| --- a/fs/jffs2/dir.c | ||||
| +++ b/fs/jffs2/dir.c | ||||
| @@ -781,18 +781,31 @@ static int jffs2_rename (struct inode *o | ||||
| @@ -777,18 +777,31 @@ static int jffs2_rename (struct inode *o | ||||
|  	int ret; | ||||
|  	struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb); | ||||
|  	struct jffs2_inode_info *victim_f = NULL; | ||||
| @@ -40,7 +40,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  		victim_f = JFFS2_INODE_INFO(d_inode(new_dentry)); | ||||
|  		if (d_is_dir(new_dentry)) { | ||||
|  			struct jffs2_full_dirent *fd; | ||||
| @@ -827,7 +840,7 @@ static int jffs2_rename (struct inode *o | ||||
| @@ -823,7 +836,7 @@ static int jffs2_rename (struct inode *o | ||||
|  	if (ret) | ||||
|  		return ret; | ||||
|   | ||||
| @@ -49,7 +49,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  		/* There was a victim. Kill it off nicely */ | ||||
|  		if (d_is_dir(new_dentry)) | ||||
|  			clear_nlink(d_inode(new_dentry)); | ||||
| @@ -853,6 +866,12 @@ static int jffs2_rename (struct inode *o | ||||
| @@ -849,6 +862,12 @@ static int jffs2_rename (struct inode *o | ||||
|  	if (flags & RENAME_WHITEOUT) | ||||
|  		/* Replace with whiteout */ | ||||
|  		ret = jffs2_whiteout(old_dir_i, old_dentry); | ||||
| @@ -62,7 +62,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  	else | ||||
|  		/* Unlink the original */ | ||||
|  		ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i), | ||||
| @@ -884,7 +903,7 @@ static int jffs2_rename (struct inode *o | ||||
| @@ -880,7 +899,7 @@ static int jffs2_rename (struct inode *o | ||||
|  		return ret; | ||||
|  	} | ||||
|   | ||||
|   | ||||
| @@ -1,61 +0,0 @@ | ||||
| From d4c4bc11353f3bea6754f7d21e3612c9f32d1d64 Mon Sep 17 00:00:00 2001 | ||||
| From: Giuseppe Lippolis <giu.lippolis@gmail.com> | ||||
| Date: Mon, 26 Mar 2018 16:34:39 +0200 | ||||
| Subject: [PATCH] net-usb: add qmi_wwan if on lte modem wistron neweb d18q1 | ||||
|  | ||||
| This modem is embedded on dlink dwr-921 router. | ||||
|     The oem configuration states: | ||||
|  | ||||
|     T:  Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  2 Spd=480 MxCh= 0 | ||||
|     D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1 | ||||
|     P:  Vendor=1435 ProdID=0918 Rev= 2.32 | ||||
|     S:  Manufacturer=Android | ||||
|     S:  Product=Android | ||||
|     S:  SerialNumber=0123456789ABCDEF | ||||
|     C:* #Ifs= 7 Cfg#= 1 Atr=80 MxPwr=500mA | ||||
|     I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option | ||||
|     E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms | ||||
|     E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms | ||||
|     I:* If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=42 Prot=01 Driver=(none) | ||||
|     E:  Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms | ||||
|     E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms | ||||
|     I:* If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option | ||||
|     E:  Ad=84(I) Atr=03(Int.) MxPS=  64 Ivl=32ms | ||||
|     E:  Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms | ||||
|     E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms | ||||
|     I:* If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=qmi_wwan | ||||
|     E:  Ad=86(I) Atr=03(Int.) MxPS=  64 Ivl=32ms | ||||
|     E:  Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms | ||||
|     E:  Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms | ||||
|     I:* If#= 4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=qmi_wwan | ||||
|     E:  Ad=88(I) Atr=03(Int.) MxPS=  64 Ivl=32ms | ||||
|     E:  Ad=87(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms | ||||
|     E:  Ad=05(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms | ||||
|     I:* If#= 5 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=qmi_wwan | ||||
|     E:  Ad=8a(I) Atr=03(Int.) MxPS=  64 Ivl=32ms | ||||
|     E:  Ad=89(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms | ||||
|     E:  Ad=06(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms | ||||
|     I:* If#= 6 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=(none) | ||||
|     E:  Ad=8b(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms | ||||
|     E:  Ad=07(O) Atr=02(Bulk) MxPS= 512 Ivl=125us | ||||
|  | ||||
| Tested on openwrt distribution | ||||
|  | ||||
| Signed-off-by: Giuseppe Lippolis <giu.lippolis@gmail.com> | ||||
| Signed-off-by: David S. Miller <davem@davemloft.net> | ||||
| --- | ||||
|  drivers/net/usb/qmi_wwan.c | 3 +++ | ||||
|  1 file changed, 3 insertions(+) | ||||
|  | ||||
| --- a/drivers/net/usb/qmi_wwan.c | ||||
| +++ b/drivers/net/usb/qmi_wwan.c | ||||
| @@ -1105,6 +1105,9 @@ static const struct usb_device_id produc | ||||
|  	{QMI_FIXED_INTF(0x0846, 0x68a2, 8)}, | ||||
|  	{QMI_FIXED_INTF(0x12d1, 0x140c, 1)},	/* Huawei E173 */ | ||||
|  	{QMI_FIXED_INTF(0x12d1, 0x14ac, 1)},	/* Huawei E1820 */ | ||||
| +	{QMI_FIXED_INTF(0x1435, 0xd181, 3)},	/* Wistron NeWeb D18Q1 */ | ||||
| +	{QMI_FIXED_INTF(0x1435, 0xd181, 4)},	/* Wistron NeWeb D18Q1 */ | ||||
| +	{QMI_FIXED_INTF(0x1435, 0xd181, 5)},	/* Wistron NeWeb D18Q1 */ | ||||
|  	{QMI_FIXED_INTF(0x16d8, 0x6003, 0)},	/* CMOTech 6003 */ | ||||
|  	{QMI_FIXED_INTF(0x16d8, 0x6007, 0)},	/* CMOTech CHE-628S */ | ||||
|  	{QMI_FIXED_INTF(0x16d8, 0x6008, 0)},	/* CMOTech CMU-301 */ | ||||
| @@ -1,28 +0,0 @@ | ||||
| From 743989254ea9f132517806d8893ca9b6cf9dc86b Mon Sep 17 00:00:00 2001 | ||||
| From: Pawel Dembicki <paweldembicki@gmail.com> | ||||
| Date: Sat, 24 Mar 2018 22:08:14 +0100 | ||||
| Subject: [PATCH] net: qmi_wwan: add BroadMobi BM806U 2020:2033 | ||||
|  | ||||
| BroadMobi BM806U is an Qualcomm MDM9225 based 3G/4G modem. | ||||
| Tested hardware BM806U is mounted on D-Link DWR-921-C3 router. | ||||
| The USB id is added to qmi_wwan.c to allow QMI communication with | ||||
| the BM806U. | ||||
|  | ||||
| Tested on 4.14 kernel and OpenWRT. | ||||
|  | ||||
| Signed-off-by: Pawel Dembicki <paweldembicki@gmail.com> | ||||
| Signed-off-by: David S. Miller <davem@davemloft.net> | ||||
| --- | ||||
|  drivers/net/usb/qmi_wwan.c | 1 + | ||||
|  1 file changed, 1 insertion(+) | ||||
|  | ||||
| --- a/drivers/net/usb/qmi_wwan.c | ||||
| +++ b/drivers/net/usb/qmi_wwan.c | ||||
| @@ -1184,6 +1184,7 @@ static const struct usb_device_id produc | ||||
|  	{QMI_FIXED_INTF(0x19d2, 0x2002, 4)},	/* ZTE (Vodafone) K3765-Z */ | ||||
|  	{QMI_FIXED_INTF(0x2001, 0x7e19, 4)},	/* D-Link DWM-221 B1 */ | ||||
|  	{QMI_FIXED_INTF(0x2001, 0x7e35, 4)},	/* D-Link DWM-222 */ | ||||
| +	{QMI_FIXED_INTF(0x2020, 0x2033, 4)},	/* BroadMobi BM806U */ | ||||
|  	{QMI_FIXED_INTF(0x0f3d, 0x68a2, 8)},    /* Sierra Wireless MC7700 */ | ||||
|  	{QMI_FIXED_INTF(0x114f, 0x68a2, 8)},    /* Sierra Wireless MC7750 */ | ||||
|  	{QMI_FIXED_INTF(0x1199, 0x68a2, 8)},	/* Sierra Wireless MC7710 in QMI mode */ | ||||
| @@ -14,7 +14,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  | ||||
| --- a/Makefile | ||||
| +++ b/Makefile | ||||
| @@ -650,12 +650,12 @@ KBUILD_CFLAGS	+= $(call cc-disable-warni | ||||
| @@ -645,12 +645,12 @@ KBUILD_CFLAGS	+= $(call cc-disable-warni | ||||
|   | ||||
|  ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE | ||||
|  KBUILD_CFLAGS	+= $(call cc-option,-Oz,-Os) | ||||
|   | ||||
| @@ -87,7 +87,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  	if (!net_eq(dev_net(dev), sock_net(sk))) | ||||
|  		goto drop; | ||||
|   | ||||
| @@ -3260,6 +3262,7 @@ static int packet_create(struct net *net | ||||
| @@ -3262,6 +3264,7 @@ static int packet_create(struct net *net | ||||
|  	mutex_init(&po->pg_vec_lock); | ||||
|  	po->rollover = NULL; | ||||
|  	po->prot_hook.func = packet_rcv; | ||||
| @@ -95,7 +95,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|   | ||||
|  	if (sock->type == SOCK_PACKET) | ||||
|  		po->prot_hook.func = packet_rcv_spkt; | ||||
| @@ -3873,6 +3876,16 @@ packet_setsockopt(struct socket *sock, i | ||||
| @@ -3875,6 +3878,16 @@ packet_setsockopt(struct socket *sock, i | ||||
|  		po->xmit = val ? packet_direct_xmit : dev_queue_xmit; | ||||
|  		return 0; | ||||
|  	} | ||||
| @@ -112,7 +112,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  	default: | ||||
|  		return -ENOPROTOOPT; | ||||
|  	} | ||||
| @@ -3925,6 +3938,13 @@ static int packet_getsockopt(struct sock | ||||
| @@ -3927,6 +3940,13 @@ static int packet_getsockopt(struct sock | ||||
|  	case PACKET_VNET_HDR: | ||||
|  		val = po->has_vnet_hdr; | ||||
|  		break; | ||||
|   | ||||
| @@ -413,7 +413,7 @@ Signed-off-by: Steven Barth <cyrus@openwrt.org> | ||||
|  } | ||||
|   | ||||
|  static bool ip6_tnl_netlink_encap_parms(struct nlattr *data[], | ||||
| @@ -2060,6 +2271,12 @@ static void ip6_tnl_dellink(struct net_d | ||||
| @@ -2064,6 +2275,12 @@ static void ip6_tnl_dellink(struct net_d | ||||
|   | ||||
|  static size_t ip6_tnl_get_size(const struct net_device *dev) | ||||
|  { | ||||
| @@ -426,7 +426,7 @@ Signed-off-by: Steven Barth <cyrus@openwrt.org> | ||||
|  	return | ||||
|  		/* IFLA_IPTUN_LINK */ | ||||
|  		nla_total_size(4) + | ||||
| @@ -2089,6 +2306,24 @@ static size_t ip6_tnl_get_size(const str | ||||
| @@ -2093,6 +2310,24 @@ static size_t ip6_tnl_get_size(const str | ||||
|  		nla_total_size(0) + | ||||
|  		/* IFLA_IPTUN_FWMARK */ | ||||
|  		nla_total_size(4) + | ||||
| @@ -451,7 +451,7 @@ Signed-off-by: Steven Barth <cyrus@openwrt.org> | ||||
|  		0; | ||||
|  } | ||||
|   | ||||
| @@ -2096,6 +2331,9 @@ static int ip6_tnl_fill_info(struct sk_b | ||||
| @@ -2100,6 +2335,9 @@ static int ip6_tnl_fill_info(struct sk_b | ||||
|  { | ||||
|  	struct ip6_tnl *tunnel = netdev_priv(dev); | ||||
|  	struct __ip6_tnl_parm *parm = &tunnel->parms; | ||||
| @@ -461,7 +461,7 @@ Signed-off-by: Steven Barth <cyrus@openwrt.org> | ||||
|   | ||||
|  	if (nla_put_u32(skb, IFLA_IPTUN_LINK, parm->link) || | ||||
|  	    nla_put_in6_addr(skb, IFLA_IPTUN_LOCAL, &parm->laddr) || | ||||
| @@ -2105,9 +2343,27 @@ static int ip6_tnl_fill_info(struct sk_b | ||||
| @@ -2109,9 +2347,27 @@ static int ip6_tnl_fill_info(struct sk_b | ||||
|  	    nla_put_be32(skb, IFLA_IPTUN_FLOWINFO, parm->flowinfo) || | ||||
|  	    nla_put_u32(skb, IFLA_IPTUN_FLAGS, parm->flags) || | ||||
|  	    nla_put_u8(skb, IFLA_IPTUN_PROTO, parm->proto) || | ||||
| @@ -490,7 +490,7 @@ Signed-off-by: Steven Barth <cyrus@openwrt.org> | ||||
|  	if (nla_put_u16(skb, IFLA_IPTUN_ENCAP_TYPE, tunnel->encap.type) || | ||||
|  	    nla_put_be16(skb, IFLA_IPTUN_ENCAP_SPORT, tunnel->encap.sport) || | ||||
|  	    nla_put_be16(skb, IFLA_IPTUN_ENCAP_DPORT, tunnel->encap.dport) || | ||||
| @@ -2147,6 +2403,7 @@ static const struct nla_policy ip6_tnl_p | ||||
| @@ -2151,6 +2407,7 @@ static const struct nla_policy ip6_tnl_p | ||||
|  	[IFLA_IPTUN_ENCAP_DPORT]	= { .type = NLA_U16 }, | ||||
|  	[IFLA_IPTUN_COLLECT_METADATA]	= { .type = NLA_FLAG }, | ||||
|  	[IFLA_IPTUN_FWMARK]		= { .type = NLA_U32 }, | ||||
|   | ||||
| @@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  | ||||
| --- a/drivers/usb/host/pci-quirks.c | ||||
| +++ b/drivers/usb/host/pci-quirks.c | ||||
| @@ -107,6 +107,8 @@ struct amd_chipset_type { | ||||
| @@ -124,6 +124,8 @@ struct amd_chipset_type { | ||||
|  	u8 rev; | ||||
|  }; | ||||
|   | ||||
| @@ -19,7 +19,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  static struct amd_chipset_info { | ||||
|  	struct pci_dev	*nb_dev; | ||||
|  	struct pci_dev	*smbus_dev; | ||||
| @@ -511,6 +513,10 @@ void usb_amd_dev_put(void) | ||||
| @@ -528,6 +530,10 @@ void usb_amd_dev_put(void) | ||||
|  } | ||||
|  EXPORT_SYMBOL_GPL(usb_amd_dev_put); | ||||
|   | ||||
| @@ -28,9 +28,9 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| +#if IS_ENABLED(CONFIG_USB_UHCI_HCD) | ||||
| + | ||||
|  /* | ||||
|   * Make sure the controller is completely inactive, unable to | ||||
|   * generate interrupts or do DMA. | ||||
| @@ -590,8 +596,17 @@ reset_needed: | ||||
|   * Check if port is disabled in BIOS on AMD Promontory host. | ||||
|   * BIOS Disabled ports may wake on connect/disconnect and need | ||||
| @@ -699,8 +705,17 @@ reset_needed: | ||||
|  	uhci_reset_hc(pdev, base); | ||||
|  	return 1; | ||||
|  } | ||||
| @@ -48,7 +48,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  static inline int io_type_enabled(struct pci_dev *pdev, unsigned int mask) | ||||
|  { | ||||
|  	u16 cmd; | ||||
| @@ -1178,3 +1193,4 @@ bool usb_xhci_needs_pci_reset(struct pci | ||||
| @@ -1287,3 +1302,4 @@ bool usb_xhci_needs_pci_reset(struct pci | ||||
|  	return false; | ||||
|  } | ||||
|  EXPORT_SYMBOL_GPL(usb_xhci_needs_pci_reset); | ||||
| @@ -65,8 +65,8 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  int usb_amd_find_chipset_info(void); | ||||
|  int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *pdev); | ||||
|  bool usb_amd_hang_symptom_quirk(void); | ||||
| @@ -19,12 +22,29 @@ void sb800_prefetch(struct device *dev, | ||||
|  bool usb_xhci_needs_pci_reset(struct pci_dev *pdev); | ||||
| @@ -20,12 +23,29 @@ bool usb_xhci_needs_pci_reset(struct pci | ||||
|  bool usb_amd_pt_check_port(struct device *device, int port); | ||||
|  #else | ||||
|  struct pci_dev; | ||||
| +static inline int usb_amd_find_chipset_info(void) | ||||
| @@ -92,9 +92,9 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| +{ | ||||
| +	return false; | ||||
| +} | ||||
|  #endif  /* CONFIG_USB_PCI */ | ||||
|   | ||||
|  #endif  /*  __LINUX_USB_PCI_QUIRKS_H  */ | ||||
|  static inline bool usb_amd_pt_check_port(struct device *device, int port) | ||||
|  { | ||||
|  	return false; | ||||
| --- a/include/linux/usb/hcd.h | ||||
| +++ b/include/linux/usb/hcd.h | ||||
| @@ -465,7 +465,14 @@ extern int usb_hcd_pci_probe(struct pci_ | ||||
|   | ||||
| @@ -65,7 +65,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org> | ||||
|  /** | ||||
|   *	ata_build_rw_tf - Build ATA taskfile for given read/write request | ||||
|   *	@tf: Target ATA taskfile | ||||
| @@ -5114,6 +5127,9 @@ struct ata_queued_cmd *ata_qc_new_init(s | ||||
| @@ -5120,6 +5133,9 @@ struct ata_queued_cmd *ata_qc_new_init(s | ||||
|  		if (tag < 0) | ||||
|  			return NULL; | ||||
|  	} | ||||
| @@ -75,7 +75,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org> | ||||
|   | ||||
|  	qc = __ata_qc_from_tag(ap, tag); | ||||
|  	qc->tag = tag; | ||||
| @@ -6015,6 +6031,9 @@ struct ata_port *ata_port_alloc(struct a | ||||
| @@ -6021,6 +6037,9 @@ struct ata_port *ata_port_alloc(struct a | ||||
|  	ap->stats.unhandled_irq = 1; | ||||
|  	ap->stats.idle_irq = 1; | ||||
|  #endif | ||||
| @@ -85,7 +85,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org> | ||||
|  	ata_sff_port_init(ap); | ||||
|   | ||||
|  	return ap; | ||||
| @@ -6036,6 +6055,12 @@ static void ata_host_release(struct devi | ||||
| @@ -6042,6 +6061,12 @@ static void ata_host_release(struct devi | ||||
|   | ||||
|  		kfree(ap->pmp_link); | ||||
|  		kfree(ap->slave_link); | ||||
| @@ -98,7 +98,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org> | ||||
|  		kfree(ap); | ||||
|  		host->ports[i] = NULL; | ||||
|  	} | ||||
| @@ -6482,7 +6507,23 @@ int ata_host_register(struct ata_host *h | ||||
| @@ -6488,7 +6513,23 @@ int ata_host_register(struct ata_host *h | ||||
|  		host->ports[i]->print_id = atomic_inc_return(&ata_print_id); | ||||
|  		host->ports[i]->local_port_no = i + 1; | ||||
|  	} | ||||
|   | ||||
| @@ -114,7 +114,7 @@ Signed-off-by: Vinod Koul <vinod.koul@intel.com> | ||||
|   | ||||
|  	struct list_head node; | ||||
|  }; | ||||
| @@ -539,7 +544,7 @@ static void bam_free_chan(struct dma_cha | ||||
| @@ -540,7 +545,7 @@ static void bam_free_chan(struct dma_cha | ||||
|   | ||||
|  	vchan_free_chan_resources(to_virt_chan(chan)); | ||||
|   | ||||
| @@ -123,7 +123,7 @@ Signed-off-by: Vinod Koul <vinod.koul@intel.com> | ||||
|  		dev_err(bchan->bdev->dev, "Cannot free busy channel\n"); | ||||
|  		goto err; | ||||
|  	} | ||||
| @@ -632,8 +637,6 @@ static struct dma_async_tx_descriptor *b | ||||
| @@ -633,8 +638,6 @@ static struct dma_async_tx_descriptor *b | ||||
|   | ||||
|  	if (flags & DMA_PREP_INTERRUPT) | ||||
|  		async_desc->flags |= DESC_FLAG_EOT; | ||||
| @@ -132,7 +132,7 @@ Signed-off-by: Vinod Koul <vinod.koul@intel.com> | ||||
|   | ||||
|  	async_desc->num_desc = num_alloc; | ||||
|  	async_desc->curr_desc = async_desc->desc; | ||||
| @@ -684,14 +687,16 @@ err_out: | ||||
| @@ -685,14 +688,16 @@ err_out: | ||||
|  static int bam_dma_terminate_all(struct dma_chan *chan) | ||||
|  { | ||||
|  	struct bam_chan *bchan = to_bam_chan(chan); | ||||
| @@ -152,7 +152,7 @@ Signed-off-by: Vinod Koul <vinod.koul@intel.com> | ||||
|  	} | ||||
|   | ||||
|  	vchan_get_all_descriptors(&bchan->vc, &head); | ||||
| @@ -763,9 +768,9 @@ static int bam_resume(struct dma_chan *c | ||||
| @@ -764,9 +769,9 @@ static int bam_resume(struct dma_chan *c | ||||
|   */ | ||||
|  static u32 process_channel_irqs(struct bam_device *bdev) | ||||
|  { | ||||
| @@ -164,7 +164,7 @@ Signed-off-by: Vinod Koul <vinod.koul@intel.com> | ||||
|   | ||||
|  	srcs = readl_relaxed(bam_addr(bdev, 0, BAM_IRQ_SRCS_EE)); | ||||
|   | ||||
| @@ -785,27 +790,40 @@ static u32 process_channel_irqs(struct b | ||||
| @@ -786,27 +791,40 @@ static u32 process_channel_irqs(struct b | ||||
|  		writel_relaxed(pipe_stts, bam_addr(bdev, i, BAM_P_IRQ_CLR)); | ||||
|   | ||||
|  		spin_lock_irqsave(&bchan->vc.lock, flags); | ||||
| @@ -214,7 +214,7 @@ Signed-off-by: Vinod Koul <vinod.koul@intel.com> | ||||
|  		} | ||||
|   | ||||
|  		spin_unlock_irqrestore(&bchan->vc.lock, flags); | ||||
| @@ -867,6 +885,7 @@ static enum dma_status bam_tx_status(str | ||||
| @@ -868,6 +886,7 @@ static enum dma_status bam_tx_status(str | ||||
|  		struct dma_tx_state *txstate) | ||||
|  { | ||||
|  	struct bam_chan *bchan = to_bam_chan(chan); | ||||
| @@ -222,7 +222,7 @@ Signed-off-by: Vinod Koul <vinod.koul@intel.com> | ||||
|  	struct virt_dma_desc *vd; | ||||
|  	int ret; | ||||
|  	size_t residue = 0; | ||||
| @@ -882,11 +901,17 @@ static enum dma_status bam_tx_status(str | ||||
| @@ -883,11 +902,17 @@ static enum dma_status bam_tx_status(str | ||||
|   | ||||
|  	spin_lock_irqsave(&bchan->vc.lock, flags); | ||||
|  	vd = vchan_find_desc(&bchan->vc, cookie); | ||||
| @@ -244,7 +244,7 @@ Signed-off-by: Vinod Koul <vinod.koul@intel.com> | ||||
|   | ||||
|  	spin_unlock_irqrestore(&bchan->vc.lock, flags); | ||||
|   | ||||
| @@ -927,63 +952,86 @@ static void bam_start_dma(struct bam_cha | ||||
| @@ -928,63 +953,86 @@ static void bam_start_dma(struct bam_cha | ||||
|  { | ||||
|  	struct virt_dma_desc *vd = vchan_next_desc(&bchan->vc); | ||||
|  	struct bam_device *bdev = bchan->bdev; | ||||
| @@ -367,7 +367,7 @@ Signed-off-by: Vinod Koul <vinod.koul@intel.com> | ||||
|   | ||||
|  	/* ensure descriptor writes and dma start not reordered */ | ||||
|  	wmb(); | ||||
| @@ -1012,7 +1060,7 @@ static void dma_tasklet(unsigned long da | ||||
| @@ -1013,7 +1061,7 @@ static void dma_tasklet(unsigned long da | ||||
|  		bchan = &bdev->channels[i]; | ||||
|  		spin_lock_irqsave(&bchan->vc.lock, flags); | ||||
|   | ||||
| @@ -376,7 +376,7 @@ Signed-off-by: Vinod Koul <vinod.koul@intel.com> | ||||
|  			bam_start_dma(bchan); | ||||
|  		spin_unlock_irqrestore(&bchan->vc.lock, flags); | ||||
|  	} | ||||
| @@ -1033,7 +1081,7 @@ static void bam_issue_pending(struct dma | ||||
| @@ -1034,7 +1082,7 @@ static void bam_issue_pending(struct dma | ||||
|  	spin_lock_irqsave(&bchan->vc.lock, flags); | ||||
|   | ||||
|  	/* if work pending and idle, start a transaction */ | ||||
| @@ -385,7 +385,7 @@ Signed-off-by: Vinod Koul <vinod.koul@intel.com> | ||||
|  		bam_start_dma(bchan); | ||||
|   | ||||
|  	spin_unlock_irqrestore(&bchan->vc.lock, flags); | ||||
| @@ -1133,6 +1181,7 @@ static void bam_channel_init(struct bam_ | ||||
| @@ -1138,6 +1186,7 @@ static void bam_channel_init(struct bam_ | ||||
|   | ||||
|  	vchan_init(&bchan->vc, &bdev->common); | ||||
|  	bchan->vc.desc_free = bam_dma_free_desc; | ||||
|   | ||||
| @@ -33,22 +33,22 @@ Signed-off-by: Thomas Pedersen <twp@codeaurora.org> | ||||
|  - clock-names: Must contain "core" for the core clock and "iface" for the | ||||
|    interface clock. | ||||
| @@ -22,7 +21,7 @@ Example: | ||||
| 			compatible = "qcom,adm"; | ||||
| 			reg = <0x18300000 0x100000>; | ||||
| 			interrupts = <0 170 0>; | ||||
|  			compatible = "qcom,adm"; | ||||
|  			reg = <0x18300000 0x100000>; | ||||
|  			interrupts = <0 170 0>; | ||||
| -			#dma-cells = <2>; | ||||
| +			#dma-cells = <1>; | ||||
|  | ||||
| 			clocks = <&gcc ADM0_CLK>, <&gcc ADM0_PBUS_CLK>; | ||||
| 			clock-names = "core", "iface"; | ||||
|   | ||||
|  			clocks = <&gcc ADM0_CLK>, <&gcc ADM0_PBUS_CLK>; | ||||
|  			clock-names = "core", "iface"; | ||||
| @@ -35,15 +34,12 @@ Example: | ||||
| 			qcom,ee = <0>; | ||||
| 		}; | ||||
|  | ||||
|  			qcom,ee = <0>; | ||||
|  		}; | ||||
|   | ||||
| -DMA clients must use the format descripted in the dma.txt file, using a three | ||||
| +DMA clients must use the format descripted in the dma.txt file, using a two | ||||
|  cell specifier for each channel. | ||||
|  | ||||
|   | ||||
| -Each dmas request consists of 3 cells: | ||||
| +Each dmas request consists of two cells: | ||||
|   1. phandle pointing to the DMA controller | ||||
| @@ -56,16 +56,16 @@ Signed-off-by: Thomas Pedersen <twp@codeaurora.org> | ||||
| - 3. CRCI assignment, if applicable.  If no CRCI flow control is required, use 0. | ||||
| -    The CRCI is used for flow control.  It identifies the peripheral device that | ||||
| -    is the source/destination for the transferred data. | ||||
|  | ||||
|   | ||||
|  Example: | ||||
|  | ||||
|   | ||||
| @@ -55,7 +51,7 @@ Example: | ||||
|  | ||||
| 		cs-gpios = <&qcom_pinmux 20 0>; | ||||
|  | ||||
|   | ||||
|  		cs-gpios = <&qcom_pinmux 20 0>; | ||||
|   | ||||
| -		dmas = <&adm_dma 6 9>, | ||||
| -			<&adm_dma 5 10>; | ||||
| +		dmas = <&adm_dma 6>, | ||||
| +			<&adm_dma 5>; | ||||
| 		dma-names = "rx", "tx"; | ||||
| 	}; | ||||
|  		dma-names = "rx", "tx"; | ||||
|  	}; | ||||
|   | ||||
| @@ -27,9 +27,9 @@ Signed-off-by: Thomas Pedersen <twp@codeaurora.org> | ||||
| --- a/drivers/dma/qcom/Kconfig | ||||
| +++ b/drivers/dma/qcom/Kconfig | ||||
| @@ -27,3 +27,13 @@ config QCOM_HIDMA | ||||
| 	  (user to kernel, kernel to kernel, etc.).  It only supports | ||||
| 	  memcpy interface. The core is not intended for general | ||||
| 	  purpose slave DMA. | ||||
|  	  (user to kernel, kernel to kernel, etc.).  It only supports | ||||
|  	  memcpy interface. The core is not intended for general | ||||
|  	  purpose slave DMA. | ||||
| + | ||||
| +config QCOM_ADM | ||||
| +	tristate "Qualcomm ADM support" | ||||
|   | ||||
| @@ -13,28 +13,28 @@ Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- a/drivers/clk/qcom/gcc-ipq806x.c | ||||
| +++ b/drivers/clk/qcom/gcc-ipq806x.c | ||||
| @@ -294,7 +294,7 @@ static struct clk_rcg gsbi1_uart_src = { | ||||
| 			.parent_names = gcc_pxo_pll8, | ||||
| 			.num_parents = 2, | ||||
| 			.ops = &clk_rcg_ops, | ||||
|  			.parent_names = gcc_pxo_pll8, | ||||
|  			.num_parents = 2, | ||||
|  			.ops = &clk_rcg_ops, | ||||
| -			.flags = CLK_SET_PARENT_GATE, | ||||
| +			.flags = CLK_SET_PARENT_GATE | CLK_IGNORE_UNUSED, | ||||
| 		}, | ||||
| 	}, | ||||
|  		}, | ||||
|  	}, | ||||
|  }; | ||||
| @@ -312,7 +312,7 @@ static struct clk_branch gsbi1_uart_clk | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.ops = &clk_branch_ops, | ||||
|  			}, | ||||
|  			.num_parents = 1, | ||||
|  			.ops = &clk_branch_ops, | ||||
| -			.flags = CLK_SET_RATE_PARENT, | ||||
| +			.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, | ||||
| 		}, | ||||
| 	}, | ||||
|  		}, | ||||
|  	}, | ||||
|  }; | ||||
| @@ -890,6 +890,7 @@ static struct clk_branch gsbi1_h_clk = { | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "gsbi1_h_clk", | ||||
| 			.ops = &clk_branch_ops, | ||||
|  		.hw.init = &(struct clk_init_data){ | ||||
|  			.name = "gsbi1_h_clk", | ||||
|  			.ops = &clk_branch_ops, | ||||
| +			.flags = CLK_IGNORE_UNUSED, | ||||
| 		}, | ||||
| 	}, | ||||
|  		}, | ||||
|  	}, | ||||
|  }; | ||||
|   | ||||
| @@ -19,9 +19,9 @@ Signed-off-by: Ram Chandra Jangir <rjangi@codeaurora.org> | ||||
| --- a/drivers/mtd/Kconfig | ||||
| +++ b/drivers/mtd/Kconfig | ||||
| @@ -194,6 +194,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. | ||||
|  | ||||
|  	  You will still need the parsing functions to be called by the driver | ||||
|  	  for your particular device. It won't happen automatically. | ||||
|   | ||||
| +config MTD_QCOM_SMEM_PARTS | ||||
| +	tristate "QCOM SMEM partitioning support" | ||||
| +	depends on QCOM_SMEM | ||||
| @@ -30,7 +30,7 @@ Signed-off-by: Ram Chandra Jangir <rjangi@codeaurora.org> | ||||
| +	  such as IPQ806x. | ||||
| + | ||||
|  comment "User Modules And Translation Layers" | ||||
|  | ||||
|   | ||||
|  # | ||||
| --- /dev/null | ||||
| +++ b/drivers/mtd/qcom_smem_part.c | ||||
| @@ -278,5 +278,5 @@ Signed-off-by: Ram Chandra Jangir <rjangi@codeaurora.org> | ||||
|  obj-$(CONFIG_MTD_MYLOADER_PARTS) += myloader.o | ||||
| +obj-$(CONFIG_MTD_QCOM_SMEM_PARTS) += qcom_smem_part.o | ||||
|  obj-y				+= parsers/ | ||||
|  | ||||
|   | ||||
|  # 'Users' - code which presents functionality to userspace. | ||||
|   | ||||
| @@ -13,10 +13,10 @@ Signed-off-by: Andy Gross <agross@codeaurora.org> | ||||
|  | ||||
| --- a/drivers/phy/qualcomm/Kconfig | ||||
| +++ b/drivers/phy/qualcomm/Kconfig | ||||
| @@ -56,3 +56,15 @@ | ||||
| 	select GENERIC_PHY | ||||
| 	help | ||||
| 	  Support for the USB HSIC ULPI compliant PHY on QCOM chipsets. | ||||
| @@ -56,3 +56,15 @@ config PHY_QCOM_USB_HSIC | ||||
|  	select GENERIC_PHY | ||||
|  	help | ||||
|  	  Support for the USB HSIC ULPI compliant PHY on QCOM chipsets. | ||||
| + | ||||
| +config PHY_QCOM_DWC3 | ||||
| +	tristate "QCOM DWC3 USB PHY support" | ||||
| @@ -31,7 +31,7 @@ Signed-off-by: Andy Gross <agross@codeaurora.org> | ||||
| + | ||||
| --- a/drivers/phy/qualcomm/Makefile | ||||
| +++ b/drivers/phy/qualcomm/Makefile | ||||
| @@ -8,3 +8,4 @@ | ||||
| @@ -8,3 +8,4 @@ obj-$(CONFIG_PHY_QCOM_UFS)		+= phy-qcom- | ||||
|  obj-$(CONFIG_PHY_QCOM_UFS)		+= phy-qcom-ufs-qmp-20nm.o | ||||
|  obj-$(CONFIG_PHY_QCOM_USB_HS) 		+= phy-qcom-usb-hs.o | ||||
|  obj-$(CONFIG_PHY_QCOM_USB_HSIC) 	+= phy-qcom-usb-hsic.o | ||||
|   | ||||
| @@ -20,9 +20,10 @@ Signed-off-by: Mathieu Olivari <mathieu@codeaurora.org> | ||||
| --- a/arch/arm/mach-qcom/Kconfig | ||||
| +++ b/arch/arm/mach-qcom/Kconfig | ||||
| @@ -6,6 +6,7 @@ menuconfig ARCH_QCOM | ||||
| 	select ARM_AMBA | ||||
| 	select PINCTRL | ||||
| 	select QCOM_SCM if SMP | ||||
|  	select ARM_AMBA | ||||
|  	select PINCTRL | ||||
|  	select QCOM_SCM if SMP | ||||
| +	select PCI_DOMAINS if PCI | ||||
| 	help | ||||
| 	  Support for Qualcomm's devicetree based systems. | ||||
|  	help | ||||
|  	  Support for Qualcomm's devicetree based systems. | ||||
|   | ||||
|   | ||||
| @@ -42,19 +42,19 @@ Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> | ||||
| --- a/arch/arm/common/Kconfig | ||||
| +++ b/arch/arm/common/Kconfig | ||||
| @@ -7,6 +7,9 @@ config DMABOUNCE | ||||
| 	bool | ||||
| 	select ZONE_DMA | ||||
|  | ||||
|  	bool | ||||
|  	select ZONE_DMA | ||||
|   | ||||
| +config KRAIT_L2_ACCESSORS | ||||
| +	bool | ||||
| + | ||||
|  config SHARP_LOCOMO | ||||
| 	bool | ||||
|  | ||||
|  	bool | ||||
|   | ||||
| --- a/arch/arm/common/Makefile | ||||
| +++ b/arch/arm/common/Makefile | ||||
| @@ -7,6 +7,7 @@ obj-y				+= firmware.o | ||||
|  | ||||
|   | ||||
|  obj-$(CONFIG_SA1111)		+= sa1111.o | ||||
|  obj-$(CONFIG_DMABOUNCE)		+= dmabounce.o | ||||
| +obj-$(CONFIG_KRAIT_L2_ACCESSORS) += krait-l2-accessors.o | ||||
|   | ||||
| @@ -34,13 +34,13 @@ Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> | ||||
| @@ -26,35 +26,24 @@ | ||||
|   * parent - parent is adjustable through clk_set_parent | ||||
|   */ | ||||
|  | ||||
|   | ||||
| -static u8 clk_mux_get_parent(struct clk_hw *hw) | ||||
| +unsigned int clk_mux_get_parent(struct clk_hw *hw, unsigned int val, | ||||
| +				unsigned int *table, unsigned long flags) | ||||
|  { | ||||
| -	struct clk_mux *mux = to_clk_mux(hw); | ||||
| 	int num_parents = clk_hw_get_num_parents(hw); | ||||
|  	int num_parents = clk_hw_get_num_parents(hw); | ||||
| -	u32 val; | ||||
| - | ||||
| -	/* | ||||
| @@ -52,40 +52,40 @@ Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> | ||||
| -	 */ | ||||
| -	val = clk_readl(mux->reg) >> mux->shift; | ||||
| -	val &= mux->mask; | ||||
|  | ||||
|   | ||||
| -	if (mux->table) { | ||||
| +	if (table) { | ||||
| 		int i; | ||||
|  | ||||
| 		for (i = 0; i < num_parents; i++) | ||||
|  		int i; | ||||
|   | ||||
|  		for (i = 0; i < num_parents; i++) | ||||
| -			if (mux->table[i] == val) | ||||
| +			if (table[i] == val) | ||||
| 				return i; | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
|  | ||||
|  				return i; | ||||
|  		return -EINVAL; | ||||
|  	} | ||||
|   | ||||
| -	if (val && (mux->flags & CLK_MUX_INDEX_BIT)) | ||||
| +	if (val && (flags & CLK_MUX_INDEX_BIT)) | ||||
| 		val = ffs(val) - 1; | ||||
|  | ||||
|  		val = ffs(val) - 1; | ||||
|   | ||||
| -	if (val && (mux->flags & CLK_MUX_INDEX_ONE)) | ||||
| +	if (val && (flags & CLK_MUX_INDEX_ONE)) | ||||
| 		val--; | ||||
|  | ||||
| 	if (val >= num_parents) | ||||
|  		val--; | ||||
|   | ||||
|  	if (val >= num_parents) | ||||
| @@ -62,23 +51,53 @@ static u8 clk_mux_get_parent(struct clk_ | ||||
|  | ||||
| 	return val; | ||||
|   | ||||
|  	return val; | ||||
|  } | ||||
| +EXPORT_SYMBOL_GPL(clk_mux_get_parent); | ||||
|  | ||||
|   | ||||
| -static int clk_mux_set_parent(struct clk_hw *hw, u8 index) | ||||
| +static u8 _clk_mux_get_parent(struct clk_hw *hw) | ||||
|  { | ||||
| 	struct clk_mux *mux = to_clk_mux(hw); | ||||
| 	u32 val; | ||||
|  	struct clk_mux *mux = to_clk_mux(hw); | ||||
|  	u32 val; | ||||
| -	unsigned long flags = 0; | ||||
|  | ||||
|   | ||||
| -	if (mux->table) { | ||||
| -		index = mux->table[index]; | ||||
| +	/* | ||||
| @@ -108,18 +108,18 @@ Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> | ||||
| + | ||||
| +	if (table) { | ||||
| +		val = table[val]; | ||||
| 	} else { | ||||
|  	} else { | ||||
| -		if (mux->flags & CLK_MUX_INDEX_BIT) | ||||
| -			index = 1 << index; | ||||
| +		if (flags & CLK_MUX_INDEX_BIT) | ||||
| +			val = 1 << index; | ||||
|  | ||||
|   | ||||
| -		if (mux->flags & CLK_MUX_INDEX_ONE) | ||||
| -			index++; | ||||
| +		if (flags & CLK_MUX_INDEX_ONE) | ||||
| +			val++; | ||||
| 	} | ||||
|  | ||||
|  	} | ||||
|   | ||||
| +	return val; | ||||
| +} | ||||
| +EXPORT_SYMBOL_GPL(clk_mux_reindex); | ||||
| @@ -132,64 +132,64 @@ Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> | ||||
| + | ||||
| +	index = clk_mux_reindex(index, mux->table, mux->flags); | ||||
| + | ||||
| 	if (mux->lock) | ||||
| 		spin_lock_irqsave(mux->lock, flags); | ||||
| 	else | ||||
|  	if (mux->lock) | ||||
|  		spin_lock_irqsave(mux->lock, flags); | ||||
|  	else | ||||
| @@ -102,14 +121,14 @@ static int clk_mux_set_parent(struct clk | ||||
|  } | ||||
|  | ||||
|   | ||||
|  const struct clk_ops clk_mux_ops = { | ||||
| -	.get_parent = clk_mux_get_parent, | ||||
| +	.get_parent = _clk_mux_get_parent, | ||||
| 	.set_parent = clk_mux_set_parent, | ||||
| 	.determine_rate = __clk_mux_determine_rate, | ||||
|  	.set_parent = clk_mux_set_parent, | ||||
|  	.determine_rate = __clk_mux_determine_rate, | ||||
|  }; | ||||
|  EXPORT_SYMBOL_GPL(clk_mux_ops); | ||||
|  | ||||
|   | ||||
|  const struct clk_ops clk_mux_ro_ops = { | ||||
| -	.get_parent = clk_mux_get_parent, | ||||
| +	.get_parent = _clk_mux_get_parent, | ||||
|  }; | ||||
|  EXPORT_SYMBOL_GPL(clk_mux_ro_ops); | ||||
|  | ||||
|   | ||||
| @@ -117,7 +136,7 @@ struct clk_hw *clk_hw_register_mux_table | ||||
| 		const char * const *parent_names, u8 num_parents, | ||||
| 		unsigned long flags, | ||||
| 		void __iomem *reg, u8 shift, u32 mask, | ||||
|  		const char * const *parent_names, u8 num_parents, | ||||
|  		unsigned long flags, | ||||
|  		void __iomem *reg, u8 shift, u32 mask, | ||||
| -		u8 clk_mux_flags, u32 *table, spinlock_t *lock) | ||||
| +		u8 clk_mux_flags, unsigned int *table, spinlock_t *lock) | ||||
|  { | ||||
| 	struct clk_mux *mux; | ||||
| 	struct clk_hw *hw; | ||||
|  	struct clk_mux *mux; | ||||
|  	struct clk_hw *hw; | ||||
| --- a/include/linux/clk-provider.h | ||||
| +++ b/include/linux/clk-provider.h | ||||
| @@ -468,7 +468,7 @@ void clk_hw_unregister_divider(struct cl | ||||
|  struct clk_mux { | ||||
| 	struct clk_hw	hw; | ||||
| 	void __iomem	*reg; | ||||
|  	struct clk_hw	hw; | ||||
|  	void __iomem	*reg; | ||||
| -	u32		*table; | ||||
| +	unsigned int	*table; | ||||
| 	u32		mask; | ||||
| 	u8		shift; | ||||
| 	u8		flags; | ||||
|  	u32		mask; | ||||
|  	u8		shift; | ||||
|  	u8		flags; | ||||
| @@ -486,6 +486,11 @@ struct clk_mux { | ||||
|  extern const struct clk_ops clk_mux_ops; | ||||
|  extern const struct clk_ops clk_mux_ro_ops; | ||||
|  | ||||
|   | ||||
| +unsigned int clk_mux_get_parent(struct clk_hw *hw, unsigned int val, | ||||
| +				unsigned int *table, unsigned long flags); | ||||
| +unsigned int clk_mux_reindex(u8 index, unsigned int *table, | ||||
| +			     unsigned long flags); | ||||
| + | ||||
|  struct clk *clk_register_mux(struct device *dev, const char *name, | ||||
| 		const char * const *parent_names, u8 num_parents, | ||||
| 		unsigned long flags, | ||||
|  		const char * const *parent_names, u8 num_parents, | ||||
|  		unsigned long flags, | ||||
| @@ -506,7 +511,7 @@ struct clk_hw *clk_hw_register_mux_table | ||||
| 		const char * const *parent_names, u8 num_parents, | ||||
| 		unsigned long flags, | ||||
| 		void __iomem *reg, u8 shift, u32 mask, | ||||
|  		const char * const *parent_names, u8 num_parents, | ||||
|  		unsigned long flags, | ||||
|  		void __iomem *reg, u8 shift, u32 mask, | ||||
| -		u8 clk_mux_flags, u32 *table, spinlock_t *lock); | ||||
| +		u8 clk_mux_flags, unsigned int *table, spinlock_t *lock); | ||||
|  | ||||
|   | ||||
|  void clk_unregister_mux(struct clk *clk); | ||||
|  void clk_hw_unregister_mux(struct clk_hw *hw); | ||||
|   | ||||
| @@ -36,7 +36,7 @@ Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> | ||||
| +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-hfpll.c | ||||
| @@ -0,0 +1,253 @@ | ||||
|   | ||||
| @@ -77,9 +77,9 @@ Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> | ||||
| --- a/drivers/clk/qcom/Kconfig | ||||
| +++ b/drivers/clk/qcom/Kconfig | ||||
| @@ -196,3 +196,11 @@ config MSM_MMCC_8996 | ||||
| 	  Support for the multimedia clock controller on msm8996 devices. | ||||
| 	  Say Y if you want to support multimedia devices such as display, | ||||
| 	  graphics, video encode/decode, camera, etc. | ||||
|  	  Support for the multimedia clock controller on msm8996 devices. | ||||
|  	  Say Y if you want to support multimedia devices such as display, | ||||
|  	  graphics, video encode/decode, camera, etc. | ||||
| + | ||||
| +config QCOM_HFPLL | ||||
| +	tristate "High-Frequency PLL (HFPLL) Clock Controller" | ||||
|   | ||||
| @@ -30,12 +30,12 @@ Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> | ||||
|  #include "clk-branch.h" | ||||
| +#include "clk-hfpll.h" | ||||
|  #include "reset.h" | ||||
|  | ||||
|   | ||||
|  static struct clk_pll pll0 = { | ||||
| @@ -113,6 +114,84 @@ static struct clk_regmap pll8_vote = { | ||||
| 	}, | ||||
|  	}, | ||||
|  }; | ||||
|  | ||||
|   | ||||
| +static struct hfpll_data hfpll0_data = { | ||||
| +	.mode_reg = 0x3200, | ||||
| +	.l_reg = 0x3208, | ||||
| @@ -115,15 +115,15 @@ Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> | ||||
| +}; | ||||
| + | ||||
|  static struct clk_pll pll14 = { | ||||
| 	.l_reg = 0x31c4, | ||||
| 	.m_reg = 0x31c8, | ||||
|  	.l_reg = 0x31c4, | ||||
|  	.m_reg = 0x31c8, | ||||
| @@ -2801,6 +2880,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, | ||||
|  	[UBI32_CORE2_CLK_SRC] = &ubi32_core2_src_clk.clkr, | ||||
|  	[NSSTCM_CLK_SRC] = &nss_tcm_src.clkr, | ||||
|  	[NSSTCM_CLK] = &nss_tcm_clk.clkr, | ||||
| +	[PLL9] = &hfpll0.clkr, | ||||
| +	[PLL10] = &hfpll1.clkr, | ||||
| +	[PLL12] = &hfpll_l2.clkr, | ||||
|  }; | ||||
|  | ||||
|   | ||||
|  static const struct qcom_reset_map gcc_ipq806x_resets[] = { | ||||
|   | ||||
| @@ -34,9 +34,9 @@ Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> | ||||
| --- a/drivers/clk/qcom/Kconfig | ||||
| +++ b/drivers/clk/qcom/Kconfig | ||||
| @@ -204,3 +204,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. | ||||
|  	  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. | ||||
| + | ||||
| +config KRAIT_CLOCKS | ||||
| +	bool | ||||
|   | ||||
| @@ -35,9 +35,9 @@ Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> | ||||
| --- a/Documentation/devicetree/bindings/arm/msm/qcom,kpss-acc.txt | ||||
| +++ b/Documentation/devicetree/bindings/arm/msm/qcom,kpss-acc.txt | ||||
| @@ -21,10 +21,17 @@ PROPERTIES | ||||
| 		    the register region. An optional second element specifies | ||||
| 		    the base address and size of the alias register region. | ||||
|  | ||||
|  		    the register region. An optional second element specifies | ||||
|  		    the base address and size of the alias register region. | ||||
|   | ||||
| +- clock-output-names: | ||||
| +	Usage: optional | ||||
| +	Value type: <string> | ||||
| @@ -45,13 +45,13 @@ Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> | ||||
| +		    CPU number starting at 0. | ||||
| + | ||||
|  Example: | ||||
|  | ||||
| 	clock-controller@2088000 { | ||||
| 		compatible = "qcom,kpss-acc-v2"; | ||||
| 		reg = <0x02088000 0x1000>, | ||||
| 		      <0x02008000 0x1000>; | ||||
|   | ||||
|  	clock-controller@2088000 { | ||||
|  		compatible = "qcom,kpss-acc-v2"; | ||||
|  		reg = <0x02088000 0x1000>, | ||||
|  		      <0x02008000 0x1000>; | ||||
| +		clock-output-names = "acpu0_aux"; | ||||
| 	}; | ||||
|  	}; | ||||
| --- /dev/null | ||||
| +++ b/Documentation/devicetree/bindings/arm/msm/qcom,kpss-gcc.txt | ||||
| @@ -0,0 +1,28 @@ | ||||
| @@ -86,9 +86,9 @@ Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> | ||||
| --- a/drivers/clk/qcom/Kconfig | ||||
| +++ b/drivers/clk/qcom/Kconfig | ||||
| @@ -205,6 +205,14 @@ config QCOM_HFPLL | ||||
| 	  Say Y if you want to support CPU frequency scaling on devices | ||||
| 	  such as MSM8974, APQ8084, etc. | ||||
|  | ||||
|  	  Say Y if you want to support CPU frequency scaling on devices | ||||
|  	  such as MSM8974, APQ8084, etc. | ||||
|   | ||||
| +config KPSS_XCC | ||||
| +	tristate "KPSS Clock Controller" | ||||
| +	depends on COMMON_CLK_QCOM | ||||
| @@ -98,8 +98,8 @@ Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> | ||||
| +	  as MSM8960, APQ8064, etc. | ||||
| + | ||||
|  config KRAIT_CLOCKS | ||||
| 	bool | ||||
| 	select KRAIT_L2_ACCESSORS | ||||
|  	bool | ||||
|  	select KRAIT_L2_ACCESSORS | ||||
| --- a/drivers/clk/qcom/Makefile | ||||
| +++ b/drivers/clk/qcom/Makefile | ||||
| @@ -36,4 +36,5 @@ obj-$(CONFIG_MSM_MMCC_8974) += mmcc-msm8 | ||||
|   | ||||
| @@ -60,9 +60,9 @@ Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> | ||||
| --- a/drivers/clk/qcom/Kconfig | ||||
| +++ b/drivers/clk/qcom/Kconfig | ||||
| @@ -213,6 +213,14 @@ config KPSS_XCC | ||||
| 	  if you want to support CPU frequency scaling on devices such | ||||
| 	  as MSM8960, APQ8064, etc. | ||||
|  | ||||
|  	  if you want to support CPU frequency scaling on devices such | ||||
|  	  as MSM8960, APQ8064, etc. | ||||
|   | ||||
| +config KRAITCC | ||||
| +	tristate "Krait Clock Controller" | ||||
| +	depends on COMMON_CLK_QCOM && ARM | ||||
| @@ -72,8 +72,8 @@ Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> | ||||
| +	  Say Y if you want to support CPU frequency scaling. | ||||
| + | ||||
|  config KRAIT_CLOCKS | ||||
| 	bool | ||||
| 	select KRAIT_L2_ACCESSORS | ||||
|  	bool | ||||
|  	select KRAIT_L2_ACCESSORS | ||||
| --- a/drivers/clk/qcom/Makefile | ||||
| +++ b/drivers/clk/qcom/Makefile | ||||
| @@ -38,3 +38,4 @@ obj-$(CONFIG_QCOM_CLK_RPM) += clk-rpm.o | ||||
|   | ||||
| @@ -31,32 +31,32 @@ Signed-off-by: Sricharan R <sricharan@codeaurora.org> | ||||
| --- a/drivers/clk/qcom/clk-krait.c | ||||
| +++ b/drivers/clk/qcom/clk-krait.c | ||||
| @@ -60,6 +60,8 @@ static int krait_mux_set_parent(struct c | ||||
| 	if (__clk_is_enabled(hw->clk)) | ||||
| 		__krait_mux_set_sel(mux, sel); | ||||
|  | ||||
|  	if (__clk_is_enabled(hw->clk)) | ||||
|  		__krait_mux_set_sel(mux, sel); | ||||
|   | ||||
| +	mux->reparent = true; | ||||
| + | ||||
| 	return 0; | ||||
|  	return 0; | ||||
|  } | ||||
|  | ||||
|   | ||||
| --- a/drivers/clk/qcom/clk-krait.h | ||||
| +++ b/drivers/clk/qcom/clk-krait.h | ||||
| @@ -23,6 +23,9 @@ struct krait_mux_clk { | ||||
| 	u32		shift; | ||||
| 	u32		en_mask; | ||||
| 	bool		lpl; | ||||
|  	u32		shift; | ||||
|  	u32		en_mask; | ||||
|  	bool		lpl; | ||||
| +	u8		safe_sel; | ||||
| +	u8		old_index; | ||||
| +	bool		reparent; | ||||
|  | ||||
| 	struct clk_hw	hw; | ||||
| 	struct notifier_block   clk_nb; | ||||
|   | ||||
|  	struct clk_hw	hw; | ||||
|  	struct notifier_block   clk_nb; | ||||
| --- a/drivers/clk/qcom/krait-cc.c | ||||
| +++ b/drivers/clk/qcom/krait-cc.c | ||||
| @@ -35,6 +35,49 @@ static unsigned int pri_mux_map[] = { | ||||
| 	0, | ||||
|  	0, | ||||
|  }; | ||||
|  | ||||
|   | ||||
| +/* | ||||
| + * Notifier function for switching the muxes to safe parent | ||||
| + * while the hfpll is getting reprogrammed. | ||||
| @@ -105,56 +105,56 @@ Signed-off-by: Sricharan R <sricharan@codeaurora.org> | ||||
|  { | ||||
| @@ -79,6 +122,7 @@ static int | ||||
|  krait_add_sec_mux(struct device *dev, int id, const char *s, | ||||
| 		  unsigned int offset, bool unique_aux) | ||||
|  		  unsigned int offset, bool unique_aux) | ||||
|  { | ||||
| +	int ret; | ||||
| 	struct krait_mux_clk *mux; | ||||
| 	static const char *sec_mux_list[] = { | ||||
| 		"acpu_aux", | ||||
|  	struct krait_mux_clk *mux; | ||||
|  	static const char *sec_mux_list[] = { | ||||
|  		"acpu_aux", | ||||
| @@ -102,6 +146,7 @@ krait_add_sec_mux(struct device *dev, in | ||||
| 	mux->shift = 2; | ||||
| 	mux->parent_map = sec_mux_map; | ||||
| 	mux->hw.init = &init; | ||||
|  	mux->shift = 2; | ||||
|  	mux->parent_map = sec_mux_map; | ||||
|  	mux->hw.init = &init; | ||||
| +	mux->safe_sel = 0; | ||||
|  | ||||
| 	init.name = kasprintf(GFP_KERNEL, "krait%s_sec_mux", s); | ||||
| 	if (!init.name) | ||||
|   | ||||
|  	init.name = kasprintf(GFP_KERNEL, "krait%s_sec_mux", s); | ||||
|  	if (!init.name) | ||||
| @@ -117,6 +162,11 @@ krait_add_sec_mux(struct device *dev, in | ||||
|  | ||||
| 	clk = devm_clk_register(dev, &mux->hw); | ||||
|  | ||||
|   | ||||
|  	clk = devm_clk_register(dev, &mux->hw); | ||||
|   | ||||
| +	ret = krait_notifier_register(dev, clk, mux); | ||||
| +	if (ret) | ||||
| +		goto unique_aux; | ||||
| + | ||||
| +unique_aux: | ||||
| 	if (unique_aux) | ||||
| 		kfree(sec_mux_list[0]); | ||||
|  	if (unique_aux) | ||||
|  		kfree(sec_mux_list[0]); | ||||
|  err_aux: | ||||
| @@ -128,6 +178,7 @@ static struct clk * | ||||
|  krait_add_pri_mux(struct device *dev, int id, const char *s, | ||||
| 		  unsigned int offset) | ||||
|  		  unsigned int offset) | ||||
|  { | ||||
| +	int ret; | ||||
| 	struct krait_mux_clk *mux; | ||||
| 	const char *p_names[3]; | ||||
| 	struct clk_init_data init = { | ||||
|  	struct krait_mux_clk *mux; | ||||
|  	const char *p_names[3]; | ||||
|  	struct clk_init_data init = { | ||||
| @@ -148,6 +199,7 @@ krait_add_pri_mux(struct device *dev, in | ||||
| 	mux->lpl = id >= 0; | ||||
| 	mux->parent_map = pri_mux_map; | ||||
| 	mux->hw.init = &init; | ||||
|  	mux->lpl = id >= 0; | ||||
|  	mux->parent_map = pri_mux_map; | ||||
|  	mux->hw.init = &init; | ||||
| +	mux->safe_sel = 2; | ||||
|  | ||||
| 	init.name = kasprintf(GFP_KERNEL, "krait%s_pri_mux", s); | ||||
| 	if (!init.name) | ||||
|   | ||||
|  	init.name = kasprintf(GFP_KERNEL, "krait%s_pri_mux", s); | ||||
|  	if (!init.name) | ||||
| @@ -173,6 +225,10 @@ krait_add_pri_mux(struct device *dev, in | ||||
|  | ||||
| 	clk = devm_clk_register(dev, &mux->hw); | ||||
|  | ||||
|   | ||||
|  	clk = devm_clk_register(dev, &mux->hw); | ||||
|   | ||||
| +	ret = krait_notifier_register(dev, clk, mux); | ||||
| +	if (ret) | ||||
| +		goto err_p3; | ||||
| +err_p3: | ||||
| 	kfree(p_names[2]); | ||||
|  	kfree(p_names[2]); | ||||
|  err_p2: | ||||
| 	kfree(p_names[1]); | ||||
|  	kfree(p_names[1]); | ||||
|   | ||||
| @@ -73,9 +73,9 @@ Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> | ||||
| --- a/drivers/cpufreq/Kconfig.arm | ||||
| +++ b/drivers/cpufreq/Kconfig.arm | ||||
| @@ -100,6 +100,15 @@ config ARM_OMAP2PLUS_CPUFREQ | ||||
| 	depends on ARCH_OMAP2PLUS | ||||
| 	default ARCH_OMAP2PLUS | ||||
|  | ||||
|  	depends on ARCH_OMAP2PLUS | ||||
|  	default ARCH_OMAP2PLUS | ||||
|   | ||||
| +config ARM_QCOM_CPUFREQ | ||||
| +	tristate "Qualcomm based" | ||||
| +	depends on ARCH_QCOM | ||||
| @@ -86,11 +86,11 @@ Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> | ||||
| +	  If in doubt, say N. | ||||
| + | ||||
|  config ARM_S3C_CPUFREQ | ||||
| 	bool | ||||
| 	help | ||||
|  	bool | ||||
|  	help | ||||
| --- a/drivers/cpufreq/Makefile | ||||
| +++ b/drivers/cpufreq/Makefile | ||||
| @@ -62,6 +62,7 @@ obj-$(CONFIG_ARM_MT8173_CPUFREQ)	+= mt81 | ||||
| @@ -62,6 +62,7 @@ obj-$(CONFIG_ARM_MEDIATEK_CPUFREQ)	+= me | ||||
|  obj-$(CONFIG_ARM_OMAP2PLUS_CPUFREQ)	+= omap-cpufreq.o | ||||
|  obj-$(CONFIG_ARM_PXA2xx_CPUFREQ)	+= pxa2xx-cpufreq.o | ||||
|  obj-$(CONFIG_PXA3xx)			+= pxa3xx-cpufreq.o | ||||
|   | ||||
| @@ -29,31 +29,31 @@ Signed-off-by: Sricharan R <sricharan@codeaurora.org> | ||||
| --- a/drivers/cpufreq/cpufreq-dt.c | ||||
| +++ b/drivers/cpufreq/cpufreq-dt.c | ||||
| @@ -220,7 +220,10 @@ static int cpufreq_init(struct cpufreq_p | ||||
| 	} | ||||
|  | ||||
| 	if (fallback) { | ||||
|  	} | ||||
|   | ||||
|  	if (fallback) { | ||||
| -		cpumask_setall(policy->cpus); | ||||
| +		struct cpufreq_dt_platform_data *pd = cpufreq_get_driver_data(); | ||||
| + | ||||
| +		if (!pd || !pd->independent_clocks) | ||||
| +			cpumask_setall(policy->cpus); | ||||
|  | ||||
| 		/* | ||||
| 		 * OPP tables are initialized only for policy->cpu, do it for | ||||
|   | ||||
|  		/* | ||||
|  		 * OPP tables are initialized only for policy->cpu, do it for | ||||
| @@ -372,6 +375,8 @@ static int dt_cpufreq_probe(struct platf | ||||
| 	if (data && data->have_governor_per_policy) | ||||
| 		dt_cpufreq_driver.flags |= CPUFREQ_HAVE_GOVERNOR_PER_POLICY; | ||||
|  | ||||
|  	if (data && data->have_governor_per_policy) | ||||
|  		dt_cpufreq_driver.flags |= CPUFREQ_HAVE_GOVERNOR_PER_POLICY; | ||||
|   | ||||
| +	dt_cpufreq_driver.driver_data = data; | ||||
| + | ||||
| 	ret = cpufreq_register_driver(&dt_cpufreq_driver); | ||||
| 	if (ret) | ||||
| 		dev_err(&pdev->dev, "failed register driver: %d\n", ret); | ||||
|  	ret = cpufreq_register_driver(&dt_cpufreq_driver); | ||||
|  	if (ret) | ||||
|  		dev_err(&pdev->dev, "failed register driver: %d\n", ret); | ||||
| --- a/drivers/cpufreq/cpufreq-dt.h | ||||
| +++ b/drivers/cpufreq/cpufreq-dt.h | ||||
| @@ -13,6 +13,12 @@ | ||||
|  #include <linux/types.h> | ||||
|  | ||||
|   | ||||
|  struct cpufreq_dt_platform_data { | ||||
| +	/* | ||||
| +	 * True when each CPU has its own clock to control its | ||||
| @@ -61,5 +61,6 @@ Signed-off-by: Sricharan R <sricharan@codeaurora.org> | ||||
| +	 * clock. | ||||
| +	 */ | ||||
| +	bool independent_clocks; | ||||
| 	bool have_governor_per_policy; | ||||
|  	bool have_governor_per_policy; | ||||
|  }; | ||||
|   | ||||
|   | ||||
| @@ -28,38 +28,38 @@ Signed-off-by: Archit Taneja <architt@codeaurora.org> | ||||
| --- a/drivers/mtd/nand/nand_base.c | ||||
| +++ b/drivers/mtd/nand/nand_base.c | ||||
| @@ -481,7 +481,11 @@ static int nand_default_block_markbad(st | ||||
| 	} else { | ||||
| 		ops.len = ops.ooblen = 1; | ||||
| 	} | ||||
|  	} else { | ||||
|  		ops.len = ops.ooblen = 1; | ||||
|  	} | ||||
| -	ops.mode = MTD_OPS_PLACE_OOB; | ||||
| + | ||||
| +	if (unlikely(chip->bbt_options & NAND_BBT_ACCESS_BBM_RAW)) | ||||
| +		ops.mode = MTD_OPS_RAW; | ||||
| +	else | ||||
| +		ops.mode = MTD_OPS_PLACE_OOB; | ||||
|  | ||||
| 	/* Write to first/last page(s) if necessary */ | ||||
| 	if (chip->bbt_options & NAND_BBT_SCANLASTPAGE) | ||||
|   | ||||
|  	/* Write to first/last page(s) if necessary */ | ||||
|  	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 @@ static int scan_block_fast(struct mtd_in | ||||
| 	ops.oobbuf = buf; | ||||
| 	ops.ooboffs = 0; | ||||
| 	ops.datbuf = NULL; | ||||
|  	ops.oobbuf = buf; | ||||
|  	ops.ooboffs = 0; | ||||
|  	ops.datbuf = NULL; | ||||
| -	ops.mode = MTD_OPS_PLACE_OOB; | ||||
| + | ||||
| +	if (unlikely(bd->options & NAND_BBT_ACCESS_BBM_RAW)) | ||||
| +		ops.mode = MTD_OPS_RAW; | ||||
| +	else | ||||
| +		ops.mode = MTD_OPS_PLACE_OOB; | ||||
|  | ||||
| 	for (j = 0; j < numpages; j++) { | ||||
| 		/* | ||||
|   | ||||
|  	for (j = 0; j < numpages; j++) { | ||||
|  		/* | ||||
| --- a/include/linux/mtd/bbm.h | ||||
| +++ b/include/linux/mtd/bbm.h | ||||
| @@ -116,6 +116,12 @@ struct nand_bbt_descr { | ||||
|  #define NAND_BBT_NO_OOB_BBM	0x00080000 | ||||
|  | ||||
|   | ||||
|  /* | ||||
| + * Force MTD_OPS_RAW mode when trying to access bad block markes from OOB. To | ||||
| + * be used by controllers which can access BBM only when ECC is disabled, i.e, | ||||
|   | ||||
| @@ -10,17 +10,17 @@ Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org> | ||||
|  | ||||
| --- a/drivers/base/power/opp/core.c | ||||
| +++ b/drivers/base/power/opp/core.c | ||||
| @@ -1277,11 +1277,13 @@ | ||||
| 	if (!opp_table) | ||||
| 		return ERR_PTR(-ENOMEM); | ||||
|  | ||||
| @@ -1277,11 +1277,13 @@ struct opp_table *dev_pm_opp_set_regulat | ||||
|  	if (!opp_table) | ||||
|  		return ERR_PTR(-ENOMEM); | ||||
|   | ||||
| +#if 0 | ||||
| 	/* This should be called before OPPs are initialized */ | ||||
| 	if (WARN_ON(!list_empty(&opp_table->opp_list))) { | ||||
| 		ret = -EBUSY; | ||||
| 		goto err; | ||||
| 	} | ||||
|  	/* This should be called before OPPs are initialized */ | ||||
|  	if (WARN_ON(!list_empty(&opp_table->opp_list))) { | ||||
|  		ret = -EBUSY; | ||||
|  		goto err; | ||||
|  	} | ||||
| +#endif | ||||
|  | ||||
| 	/* Already have regulators set */ | ||||
| 	if (opp_table->regulators) { | ||||
|   | ||||
|  	/* Already have regulators set */ | ||||
|  	if (opp_table->regulators) { | ||||
|   | ||||
| @@ -27,9 +27,9 @@ Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org> | ||||
|  | ||||
| --- a/drivers/base/power/opp/core.c | ||||
| +++ b/drivers/base/power/opp/core.c | ||||
| @@ -1605,6 +1605,83 @@ unlock: | ||||
| @@ -1605,6 +1605,83 @@ put_table: | ||||
|  } | ||||
|  | ||||
|   | ||||
|  /** | ||||
| + * dev_pm_opp_adjust_voltage() - helper to change the voltage of an OPP | ||||
| + * @dev:		device for which we do this operation | ||||
| @@ -114,27 +114,27 @@ Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org> | ||||
| --- a/include/linux/pm_opp.h | ||||
| +++ b/include/linux/pm_opp.h | ||||
| @@ -25,6 +25,7 @@ struct opp_table; | ||||
|  | ||||
|   | ||||
|  enum dev_pm_opp_event { | ||||
| 	OPP_EVENT_ADD, OPP_EVENT_REMOVE, OPP_EVENT_ENABLE, OPP_EVENT_DISABLE, | ||||
|  	OPP_EVENT_ADD, OPP_EVENT_REMOVE, OPP_EVENT_ENABLE, OPP_EVENT_DISABLE, | ||||
| +	OPP_EVENT_ADJUST_VOLTAGE, | ||||
|  }; | ||||
|  | ||||
|   | ||||
|  /** | ||||
| @@ -108,6 +109,9 @@ int dev_pm_opp_add(struct device *dev, u | ||||
| 		   unsigned long u_volt); | ||||
|  		   unsigned long u_volt); | ||||
|  void dev_pm_opp_remove(struct device *dev, unsigned long freq); | ||||
|  | ||||
|   | ||||
| +int dev_pm_opp_adjust_voltage(struct device *dev, unsigned long freq, | ||||
| +			      unsigned long u_volt); | ||||
| + | ||||
|  int dev_pm_opp_enable(struct device *dev, unsigned long freq); | ||||
|  | ||||
|   | ||||
|  int dev_pm_opp_disable(struct device *dev, unsigned long freq); | ||||
| @@ -208,6 +212,13 @@ static inline void dev_pm_opp_remove(str | ||||
|  { | ||||
|  } | ||||
|  | ||||
|   | ||||
| +static inline int | ||||
| +dev_pm_opp_adjust_voltage(struct device *dev, unsigned long freq, | ||||
| +			  unsigned long u_volt) | ||||
| @@ -144,4 +144,4 @@ Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org> | ||||
| + | ||||
|  static inline int dev_pm_opp_enable(struct device *dev, unsigned long freq) | ||||
|  { | ||||
| 	return 0; | ||||
|  	return 0; | ||||
|   | ||||
| @@ -15,7 +15,7 @@ Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org> | ||||
| @@ -126,6 +126,27 @@ unsigned long dev_pm_opp_get_freq(struct | ||||
|  } | ||||
|  EXPORT_SYMBOL_GPL(dev_pm_opp_get_freq); | ||||
|  | ||||
|   | ||||
| +struct regulator *dev_pm_opp_get_regulator(struct device *dev) | ||||
| +{ | ||||
| +	struct opp_table *opp_table; | ||||
| @@ -42,10 +42,11 @@ Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org> | ||||
|   * @opp: opp for which turbo mode is being verified | ||||
| --- a/include/linux/pm_opp.h | ||||
| +++ b/include/linux/pm_opp.h | ||||
| @@ -85,6 +85,7 @@ enum dev_pm_opp_event { | ||||
| @@ -85,6 +85,7 @@ void dev_pm_opp_put_opp_table(struct opp | ||||
|  unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp); | ||||
|  | ||||
|   | ||||
|  unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp); | ||||
| +struct regulator *dev_pm_opp_get_regulator(struct device *dev); | ||||
|  | ||||
|   | ||||
|  bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp); | ||||
|   | ||||
|   | ||||
| @@ -18,21 +18,21 @@ Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org> | ||||
| --- a/drivers/base/power/opp/core.c | ||||
| +++ b/drivers/base/power/opp/core.c | ||||
| @@ -1649,6 +1649,7 @@ int dev_pm_opp_adjust_voltage(struct dev | ||||
| 	struct opp_table *opp_table; | ||||
| 	struct dev_pm_opp *new_opp, *tmp_opp, *opp = ERR_PTR(-ENODEV); | ||||
| 	int r = 0; | ||||
|  	struct opp_table *opp_table; | ||||
|  	struct dev_pm_opp *new_opp, *tmp_opp, *opp = ERR_PTR(-ENODEV); | ||||
|  	int r = 0; | ||||
| +	unsigned long tol; | ||||
|  | ||||
| 	/* keep the node allocated */ | ||||
| 	new_opp = kmalloc(sizeof(*new_opp), GFP_KERNEL); | ||||
|   | ||||
|  	/* keep the node allocated */ | ||||
|  	new_opp = kmalloc(sizeof(*new_opp), GFP_KERNEL); | ||||
| @@ -1685,6 +1686,10 @@ int dev_pm_opp_adjust_voltage(struct dev | ||||
|  | ||||
| 	/* plug in new node */ | ||||
| 	new_opp->supplies[0].u_volt = u_volt; | ||||
|   | ||||
|  	/* plug in new node */ | ||||
|  	new_opp->supplies[0].u_volt = u_volt; | ||||
| +	tol = u_volt * opp_table->voltage_tolerance_v1 / 100; | ||||
| +	new_opp->supplies[0].u_volt = u_volt; | ||||
| +	new_opp->supplies[0].u_volt_min = u_volt - tol; | ||||
| +	new_opp->supplies[0].u_volt_max = u_volt + tol; | ||||
|  | ||||
| 	list_replace(&opp->node, &new_opp->node); | ||||
| 	mutex_unlock(&opp_table_lock); | ||||
|   | ||||
|  	list_replace(&opp->node, &new_opp->node); | ||||
|  	mutex_unlock(&opp_table_lock); | ||||
|   | ||||
| @@ -12,29 +12,29 @@ Signed-off-by: Adrian Panella <ianchi74@outlook.com> | ||||
| --- a/Documentation/devicetree/bindings/mfd/qcom-rpm.txt | ||||
| +++ b/Documentation/devicetree/bindings/mfd/qcom-rpm.txt | ||||
| @@ -61,6 +61,7 @@ Regulator nodes are identified by their | ||||
| 		    "qcom,rpm-pm8901-regulators" | ||||
| 		    "qcom,rpm-pm8921-regulators" | ||||
| 		    "qcom,rpm-pm8018-regulators" | ||||
|  		    "qcom,rpm-pm8901-regulators" | ||||
|  		    "qcom,rpm-pm8921-regulators" | ||||
|  		    "qcom,rpm-pm8018-regulators" | ||||
| +		    "qcom,rpm-smb208-regulators" | ||||
|  | ||||
|   | ||||
|  - vdd_l0_l1_lvs-supply: | ||||
|  - vdd_l2_l11_l12-supply: | ||||
| @@ -171,6 +172,9 @@ pm8018: | ||||
| 	s1, s2, s3, s4, s5, , l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, | ||||
| 	l12, l14, lvs1 | ||||
|  | ||||
|  	s1, s2, s3, s4, s5, , l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, | ||||
|  	l12, l14, lvs1 | ||||
|   | ||||
| +smb208: | ||||
| +	s1a, s1b, s2a, s2b | ||||
| + | ||||
|  The content of each sub-node is defined by the standard binding for regulators - | ||||
|  see regulator.txt - with additional custom properties described below: | ||||
|  | ||||
|   | ||||
| --- a/drivers/regulator/qcom_rpm-regulator.c | ||||
| +++ b/drivers/regulator/qcom_rpm-regulator.c | ||||
| @@ -933,12 +933,21 @@ static const struct rpm_regulator_data r | ||||
| 	{ } | ||||
|  	{ } | ||||
|  }; | ||||
|  | ||||
|   | ||||
| +static const struct rpm_regulator_data rpm_smb208_regulators[] = { | ||||
| +	{ "s1a",  QCOM_RPM_SMB208_S1a, &smb208_smps, "vin_s1a" }, | ||||
| +	{ "s1b",  QCOM_RPM_SMB208_S1b, &smb208_smps, "vin_s1b" }, | ||||
| @@ -44,12 +44,12 @@ Signed-off-by: Adrian Panella <ianchi74@outlook.com> | ||||
| +}; | ||||
| + | ||||
|  static const struct of_device_id rpm_of_match[] = { | ||||
| 	{ .compatible = "qcom,rpm-pm8018-regulators", | ||||
| 		.data = &rpm_pm8018_regulators }, | ||||
| 	{ .compatible = "qcom,rpm-pm8058-regulators", .data = &rpm_pm8058_regulators }, | ||||
| 	{ .compatible = "qcom,rpm-pm8901-regulators", .data = &rpm_pm8901_regulators }, | ||||
| 	{ .compatible = "qcom,rpm-pm8921-regulators", .data = &rpm_pm8921_regulators }, | ||||
|  	{ .compatible = "qcom,rpm-pm8018-regulators", | ||||
|  		.data = &rpm_pm8018_regulators }, | ||||
|  	{ .compatible = "qcom,rpm-pm8058-regulators", .data = &rpm_pm8058_regulators }, | ||||
|  	{ .compatible = "qcom,rpm-pm8901-regulators", .data = &rpm_pm8901_regulators }, | ||||
|  	{ .compatible = "qcom,rpm-pm8921-regulators", .data = &rpm_pm8921_regulators }, | ||||
| +	{ .compatible = "qcom,rpm-smb208-regulators", .data = &rpm_smb208_regulators }, | ||||
| 	{ } | ||||
|  	{ } | ||||
|  }; | ||||
|  MODULE_DEVICE_TABLE(of, rpm_of_match); | ||||
|   | ||||
| @@ -26,19 +26,19 @@ Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org> | ||||
| --- a/drivers/cpufreq/cpufreq-dt.c | ||||
| +++ b/drivers/cpufreq/cpufreq-dt.c | ||||
| @@ -32,6 +32,9 @@ struct private_data { | ||||
| 	struct device *cpu_dev; | ||||
| 	struct thermal_cooling_device *cdev; | ||||
| 	const char *reg_name; | ||||
|  	struct device *cpu_dev; | ||||
|  	struct thermal_cooling_device *cdev; | ||||
|  	const char *reg_name; | ||||
| +	struct notifier_block opp_nb; | ||||
| +	struct mutex lock; | ||||
| +	unsigned long opp_freq; | ||||
|  }; | ||||
|  | ||||
|   | ||||
|  static struct freq_attr *cpufreq_dt_attr[] = { | ||||
| @@ -43,9 +46,16 @@ static struct freq_attr *cpufreq_dt_attr | ||||
|  static int set_target(struct cpufreq_policy *policy, unsigned int index) | ||||
|  { | ||||
| 	struct private_data *priv = policy->driver_data; | ||||
|  	struct private_data *priv = policy->driver_data; | ||||
| +	int ret; | ||||
| +	unsigned long target_freq = policy->freq_table[index].frequency * 1000; | ||||
| + | ||||
| @@ -47,17 +47,17 @@ Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org> | ||||
| +	if (!ret) | ||||
| +		priv->opp_freq = target_freq; | ||||
| +	mutex_unlock(&priv->lock); | ||||
|  | ||||
|   | ||||
| -	return dev_pm_opp_set_rate(priv->cpu_dev, | ||||
| -				   policy->freq_table[index].frequency * 1000); | ||||
| +	return ret; | ||||
|  } | ||||
|  | ||||
|   | ||||
|  /* | ||||
| @@ -86,6 +96,39 @@ node_put: | ||||
| 	return name; | ||||
|  	return name; | ||||
|  } | ||||
|  | ||||
|   | ||||
| +static int opp_notifier(struct notifier_block *nb, unsigned long event, | ||||
| +			void *data) | ||||
| +{ | ||||
| @@ -93,39 +93,39 @@ Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org> | ||||
| + | ||||
|  static int resources_available(void) | ||||
|  { | ||||
| 	struct device *cpu_dev; | ||||
|  	struct device *cpu_dev; | ||||
| @@ -152,6 +195,7 @@ static int cpufreq_init(struct cpufreq_p | ||||
| 	bool fallback = false; | ||||
| 	const char *name; | ||||
| 	int ret; | ||||
|  	bool fallback = false; | ||||
|  	const char *name; | ||||
|  	int ret; | ||||
| +	struct srcu_notifier_head *opp_srcu_head; | ||||
|  | ||||
| 	cpu_dev = get_cpu_device(policy->cpu); | ||||
| 	if (!cpu_dev) { | ||||
|   | ||||
|  	cpu_dev = get_cpu_device(policy->cpu); | ||||
|  	if (!cpu_dev) { | ||||
| @@ -241,13 +285,16 @@ static int cpufreq_init(struct cpufreq_p | ||||
| 		goto out_free_opp; | ||||
| 	} | ||||
|  | ||||
|  		goto out_free_opp; | ||||
|  	} | ||||
|   | ||||
| +	mutex_init(&priv->lock); | ||||
| +	dev_pm_opp_register_notifier(cpu_dev, &priv->opp_nb); | ||||
| + | ||||
| 	priv->reg_name = name; | ||||
| 	priv->opp_table = opp_table; | ||||
|  | ||||
| 	ret = dev_pm_opp_init_cpufreq_table(cpu_dev, &freq_table); | ||||
| 	if (ret) { | ||||
| 		dev_err(cpu_dev, "failed to init cpufreq table: %d\n", ret); | ||||
|  	priv->reg_name = name; | ||||
|  	priv->opp_table = opp_table; | ||||
|   | ||||
|  	ret = dev_pm_opp_init_cpufreq_table(cpu_dev, &freq_table); | ||||
|  	if (ret) { | ||||
|  		dev_err(cpu_dev, "failed to init cpufreq table: %d\n", ret); | ||||
| -		goto out_free_priv; | ||||
| +		goto out_unregister_nb; | ||||
| 	} | ||||
|  | ||||
| 	priv->cpu_dev = cpu_dev; | ||||
| @@ -283,6 +343,8 @@ static int cpufreq_init(struct cpufreq_p | ||||
|  | ||||
|  	} | ||||
|   | ||||
|  	priv->cpu_dev = cpu_dev; | ||||
| @@ -283,6 +330,8 @@ static int cpufreq_init(struct cpufreq_p | ||||
|   | ||||
|  out_free_cpufreq_table: | ||||
| 	dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table); | ||||
|  	dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table); | ||||
| +out_unregister_nb: | ||||
| +	dev_pm_opp_unregister_notifier(cpu_dev, &priv->opp_nb); | ||||
|  out_free_priv: | ||||
| 	kfree(priv); | ||||
|  	kfree(priv); | ||||
|  out_free_opp: | ||||
|   | ||||
| @@ -12,15 +12,15 @@ Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org> | ||||
| --- a/drivers/cpufreq/cpufreq-dt.c | ||||
| +++ b/drivers/cpufreq/cpufreq-dt.c | ||||
| @@ -48,11 +48,41 @@ static int set_target(struct cpufreq_pol | ||||
| 	struct private_data *priv = policy->driver_data; | ||||
| 	int ret; | ||||
| 	unsigned long target_freq = policy->freq_table[index].frequency * 1000; | ||||
|  	struct private_data *priv = policy->driver_data; | ||||
|  	int ret; | ||||
|  	unsigned long target_freq = policy->freq_table[index].frequency * 1000; | ||||
| +	struct clk *l2_clk = policy->l2_clk; | ||||
| +	unsigned int l2_freq; | ||||
| +	unsigned long new_l2_freq = 0; | ||||
|  | ||||
| 	mutex_lock(&priv->lock); | ||||
| 	ret = dev_pm_opp_set_rate(priv->cpu_dev, target_freq); | ||||
|   | ||||
|  	mutex_lock(&priv->lock); | ||||
|  	ret = dev_pm_opp_set_rate(priv->cpu_dev, target_freq); | ||||
| -	if (!ret) | ||||
| + | ||||
| +	if (!ret) { | ||||
| @@ -48,25 +48,25 @@ Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org> | ||||
| +			} | ||||
| +		} | ||||
| + | ||||
| 		priv->opp_freq = target_freq; | ||||
|  		priv->opp_freq = target_freq; | ||||
| +	} | ||||
| + | ||||
| 	mutex_unlock(&priv->lock); | ||||
|  | ||||
| 	return ret; | ||||
|  	mutex_unlock(&priv->lock); | ||||
|   | ||||
|  	return ret; | ||||
| @@ -196,6 +226,8 @@ static int cpufreq_init(struct cpufreq_p | ||||
| 	const char *name; | ||||
| 	int ret; | ||||
| 	struct srcu_notifier_head *opp_srcu_head; | ||||
|  	const char *name; | ||||
|  	int ret; | ||||
|  	struct srcu_notifier_head *opp_srcu_head; | ||||
| +	struct device_node *l2_np; | ||||
| +	struct clk *l2_clk = NULL; | ||||
|  | ||||
| 	cpu_dev = get_cpu_device(policy->cpu); | ||||
| 	if (!cpu_dev) { | ||||
|   | ||||
|  	cpu_dev = get_cpu_device(policy->cpu); | ||||
|  	if (!cpu_dev) { | ||||
| @@ -303,6 +335,13 @@ static int cpufreq_init(struct cpufreq_p | ||||
|  | ||||
| 	policy->suspend_freq = dev_pm_opp_get_suspend_opp_freq(cpu_dev) / 1000; | ||||
|  | ||||
|   | ||||
|  	policy->suspend_freq = dev_pm_opp_get_suspend_opp_freq(cpu_dev) / 1000; | ||||
|   | ||||
| +	l2_clk = clk_get(cpu_dev, "l2"); | ||||
| +	if (!IS_ERR(l2_clk)) | ||||
| +		policy->l2_clk = l2_clk; | ||||
| @@ -74,17 +74,17 @@ Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org> | ||||
| +	if (l2_np) | ||||
| +		of_property_read_u32_array(l2_np, "qcom,l2-rates", policy->l2_rate, 3); | ||||
| + | ||||
| 	ret = cpufreq_table_validate_and_show(policy, freq_table); | ||||
| 	if (ret) { | ||||
| 		dev_err(cpu_dev, "%s: invalid frequency table: %d\n", __func__, | ||||
|  	ret = cpufreq_table_validate_and_show(policy, freq_table); | ||||
|  	if (ret) { | ||||
|  		dev_err(cpu_dev, "%s: invalid frequency table: %d\n", __func__, | ||||
| --- a/include/linux/cpufreq.h | ||||
| +++ b/include/linux/cpufreq.h | ||||
| @@ -73,6 +73,8 @@ struct cpufreq_policy { | ||||
| 	unsigned int		cpu;    /* cpu managing this policy, must be online */ | ||||
|  | ||||
| 	struct clk		*clk; | ||||
|  	unsigned int		cpu;    /* cpu managing this policy, must be online */ | ||||
|   | ||||
|  	struct clk		*clk; | ||||
| +	struct clk		*l2_clk; /* L2 clock */ | ||||
| +	unsigned int		l2_rate[3]; /* L2 bus clock rate thresholds */ | ||||
| 	struct cpufreq_cpuinfo	cpuinfo;/* see above */ | ||||
|  | ||||
| 	unsigned int		min;    /* in kHz */ | ||||
|  	struct cpufreq_cpuinfo	cpuinfo;/* see above */ | ||||
|   | ||||
|  	unsigned int		min;    /* in kHz */ | ||||
|   | ||||
| @@ -11,13 +11,13 @@ Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org> | ||||
| --- a/drivers/cpufreq/cpufreq-dt.c | ||||
| +++ b/drivers/cpufreq/cpufreq-dt.c | ||||
| @@ -143,8 +143,10 @@ static int opp_notifier(struct notifier_ | ||||
| 			ret = PTR_ERR(cpu_reg); | ||||
| 			goto out; | ||||
| 		} | ||||
|  			ret = PTR_ERR(cpu_reg); | ||||
|  			goto out; | ||||
|  		} | ||||
| +		rcu_read_lock(); | ||||
| 		volt = dev_pm_opp_get_voltage(opp); | ||||
| 		freq = dev_pm_opp_get_freq(opp); | ||||
|  		volt = dev_pm_opp_get_voltage(opp); | ||||
|  		freq = dev_pm_opp_get_freq(opp); | ||||
| +		rcu_read_unlock(); | ||||
|  | ||||
| 		mutex_lock(&priv->lock); | ||||
| 		if (freq == priv->opp_freq) { | ||||
|   | ||||
|  		mutex_lock(&priv->lock); | ||||
|  		if (freq == priv->opp_freq) { | ||||
|   | ||||
| @@ -17,9 +17,9 @@ Signed-off-by: Lina Iyer <lina.iyer@linaro.org> | ||||
| --- a/drivers/cpuidle/Kconfig.arm | ||||
| +++ b/drivers/cpuidle/Kconfig.arm | ||||
| @@ -75,3 +75,10 @@ config ARM_MVEBU_V7_CPUIDLE | ||||
| 	depends on ARCH_MVEBU && !ARM64 | ||||
| 	help | ||||
| 	  Select this to enable cpuidle on Armada 370, 38x and XP processors. | ||||
|  	depends on ARCH_MVEBU && !ARM64 | ||||
|  	help | ||||
|  	  Select this to enable cpuidle on Armada 370, 38x and XP processors. | ||||
| + | ||||
| +config ARM_QCOM_CPUIDLE | ||||
| +	bool "CPU Idle Driver for QCOM processors" | ||||
|   | ||||
| @@ -33,15 +33,15 @@ Signed-off-by: Mathieu Olivari <mathieu@codeaurora.org> | ||||
|  | ||||
| --- a/arch/arm/Kconfig | ||||
| +++ b/arch/arm/Kconfig | ||||
| @@ -341,7 +341,7 @@ | ||||
| 	depends on MMU | ||||
| 	select ARM_HAS_SG_CHAIN | ||||
| 	select ARM_PATCH_PHYS_VIRT | ||||
| @@ -341,7 +341,7 @@ config ARCH_MULTIPLATFORM | ||||
|  	depends on MMU | ||||
|  	select ARM_HAS_SG_CHAIN | ||||
|  	select ARM_PATCH_PHYS_VIRT | ||||
| -	select AUTO_ZRELADDR | ||||
| +	select AUTO_ZRELADDR if !ARCH_QCOM | ||||
| 	select TIMER_OF | ||||
| 	select COMMON_CLK | ||||
| 	select GENERIC_CLOCKEVENTS | ||||
|  	select TIMER_OF | ||||
|  	select COMMON_CLK | ||||
|  	select GENERIC_CLOCKEVENTS | ||||
| --- a/arch/arm/Makefile | ||||
| +++ b/arch/arm/Makefile | ||||
| @@ -255,9 +255,11 @@ MACHINE  := arch/arm/mach-$(word 1,$(mac | ||||
| @@ -53,7 +53,7 @@ Signed-off-by: Mathieu Olivari <mathieu@codeaurora.org> | ||||
|  MACHINE  := | ||||
|  endif | ||||
| +endif | ||||
|  | ||||
|   | ||||
|  machdirs := $(patsubst %,arch/arm/mach-%/,$(machine-y)) | ||||
|  platdirs := $(patsubst %,arch/arm/plat-%/,$(sort $(plat-y))) | ||||
| --- /dev/null | ||||
|   | ||||
| @@ -11,13 +11,13 @@ Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- a/drivers/mtd/qcom_smem_part.c | ||||
| +++ b/drivers/mtd/qcom_smem_part.c | ||||
| @@ -189,6 +189,10 @@ static int parse_qcom_smem_partitions(st | ||||
| 		m_part->size = le32_to_cpu(s_part->size) * (*smem_blksz); | ||||
| 		m_part->offset = le32_to_cpu(s_part->start) * (*smem_blksz); | ||||
|  | ||||
|  		m_part->size = le32_to_cpu(s_part->size) * (*smem_blksz); | ||||
|  		m_part->offset = le32_to_cpu(s_part->start) * (*smem_blksz); | ||||
|   | ||||
| +		/* "rootfs" conflicts with OpenWrt auto mounting */ | ||||
| +		if (mtd_type_is_nand(master) && !strcmp(m_part->name, "rootfs")) | ||||
| +			m_part->name = "ubi"; | ||||
| + | ||||
| 		/* | ||||
| 		 * The last SMEM partition may have its size marked as | ||||
| 		 * something like 0xffffffff, which means "until the end of the | ||||
|  		/* | ||||
|  		 * The last SMEM partition may have its size marked as | ||||
|  		 * something like 0xffffffff, which means "until the end of the | ||||
|   | ||||
| @@ -15,11 +15,11 @@ Signed-off-by: Abhishek Sahu <absahu@codeaurora.org> | ||||
| --- a/drivers/clk/qcom/gcc-ipq806x.c | ||||
| +++ b/drivers/clk/qcom/gcc-ipq806x.c | ||||
| @@ -1233,6 +1233,8 @@ static struct clk_rcg prng_src = { | ||||
| 		.parent_map = gcc_pxo_pll8_map, | ||||
| 	}, | ||||
| 	.clkr = { | ||||
|  		.parent_map = gcc_pxo_pll8_map, | ||||
|  	}, | ||||
|  	.clkr = { | ||||
| +		.enable_reg = 0x2e80, | ||||
| +		.enable_mask = BIT(11), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "prng_src", | ||||
| 			.parent_names = gcc_pxo_pll8, | ||||
|  		.hw.init = &(struct clk_init_data){ | ||||
|  			.name = "prng_src", | ||||
|  			.parent_names = gcc_pxo_pll8, | ||||
|   | ||||
| @@ -39,7 +39,7 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org> | ||||
|   - "qcom,msm8974-tsens" : For 8974 Family of SoCs | ||||
|   - "qcom,msm8996-tsens" : For 8996 Family of SoCs | ||||
| + - "qcom,ipq8064-tsens" : For IPQ8064 | ||||
|  | ||||
|   | ||||
|  - reg: Address range of the thermal registers | ||||
|  - #thermal-sensor-cells : Should be 1. See ./thermal.txt for a description. | ||||
| --- a/drivers/thermal/qcom/Makefile | ||||
| @@ -606,22 +606,22 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org> | ||||
| --- a/drivers/thermal/qcom/tsens.c | ||||
| +++ b/drivers/thermal/qcom/tsens.c | ||||
| @@ -72,6 +72,9 @@ static const struct of_device_id tsens_t | ||||
| 	}, { | ||||
| 		.compatible = "qcom,msm8996-tsens", | ||||
| 		.data = &data_8996, | ||||
|  	}, { | ||||
|  		.compatible = "qcom,msm8996-tsens", | ||||
|  		.data = &data_8996, | ||||
| +	}, { | ||||
| +		.compatible = "qcom,ipq8064-tsens", | ||||
| +		.data = &data_ipq8064, | ||||
| 	}, | ||||
| 	{} | ||||
|  	}, | ||||
|  	{} | ||||
|  }; | ||||
| --- a/drivers/thermal/qcom/tsens.h | ||||
| +++ b/drivers/thermal/qcom/tsens.h | ||||
| @@ -89,6 +89,6 @@ void compute_intercept_slope(struct tsen | ||||
|  int init_common(struct tsens_device *); | ||||
|  int get_temp_common(struct tsens_device *, int, int *); | ||||
|  | ||||
|   | ||||
| -extern const struct tsens_data data_8916, data_8974, data_8960, data_8996; | ||||
| +extern const struct tsens_data data_8916, data_8974, data_8960, data_8996, data_ipq8064; | ||||
|  | ||||
|   | ||||
|  #endif /* __QCOM_TSENS_H__ */ | ||||
|   | ||||
| @@ -26,84 +26,84 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org> | ||||
| @@ -12,11 +12,15 @@ Required properties: | ||||
|  - Refer to Documentation/devicetree/bindings/nvmem/nvmem.txt to know how to specify | ||||
|  nvmem cells | ||||
|  | ||||
|   | ||||
| +Optional properties: | ||||
| +- interrupts: Interrupt which gets triggered when threshold is hit | ||||
| + | ||||
|  Example: | ||||
|  tsens: thermal-sensor@900000 { | ||||
| 		compatible = "qcom,msm8916-tsens"; | ||||
| 		reg = <0x4a8000 0x2000>; | ||||
| 		nvmem-cells = <&tsens_caldata>, <&tsens_calsel>; | ||||
| 		nvmem-cell-names = "caldata", "calsel"; | ||||
|  		compatible = "qcom,msm8916-tsens"; | ||||
|  		reg = <0x4a8000 0x2000>; | ||||
|  		nvmem-cells = <&tsens_caldata>, <&tsens_calsel>; | ||||
|  		nvmem-cell-names = "caldata", "calsel"; | ||||
| +		interrupts = <0 178 0>; | ||||
| 		#thermal-sensor-cells = <1>; | ||||
| 	}; | ||||
|  		#thermal-sensor-cells = <1>; | ||||
|  	}; | ||||
| --- a/drivers/thermal/of-thermal.c | ||||
| +++ b/drivers/thermal/of-thermal.c | ||||
| @@ -95,7 +95,7 @@ static int of_thermal_get_temp(struct th | ||||
|  { | ||||
| 	struct __thermal_zone *data = tz->devdata; | ||||
|  | ||||
|  	struct __thermal_zone *data = tz->devdata; | ||||
|   | ||||
| -	if (!data->ops->get_temp) | ||||
| +	if (!data->ops->get_temp || (data->mode == THERMAL_DEVICE_DISABLED)) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| 	return data->ops->get_temp(data->sensor_data, temp); | ||||
|  		return -EINVAL; | ||||
|   | ||||
|  	return data->ops->get_temp(data->sensor_data, temp); | ||||
| @@ -106,7 +106,8 @@ static int of_thermal_set_trips(struct t | ||||
|  { | ||||
| 	struct __thermal_zone *data = tz->devdata; | ||||
|  | ||||
|  	struct __thermal_zone *data = tz->devdata; | ||||
|   | ||||
| -	if (!data->ops || !data->ops->set_trips) | ||||
| +	if (!data->ops || !data->ops->set_trips | ||||
| +			|| (data->mode == THERMAL_DEVICE_DISABLED)) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| 	return data->ops->set_trips(data->sensor_data, low, high); | ||||
|  		return -EINVAL; | ||||
|   | ||||
|  	return data->ops->set_trips(data->sensor_data, low, high); | ||||
| @@ -192,6 +193,9 @@ static int of_thermal_set_emul_temp(stru | ||||
|  { | ||||
| 	struct __thermal_zone *data = tz->devdata; | ||||
|  | ||||
|  	struct __thermal_zone *data = tz->devdata; | ||||
|   | ||||
| +	if (data->mode == THERMAL_DEVICE_DISABLED) | ||||
| +		return -EINVAL; | ||||
| + | ||||
| 	return data->ops->set_emul_temp(data->sensor_data, temp); | ||||
|  	return data->ops->set_emul_temp(data->sensor_data, temp); | ||||
|  } | ||||
|  | ||||
|   | ||||
| @@ -200,7 +204,7 @@ static int of_thermal_get_trend(struct t | ||||
|  { | ||||
| 	struct __thermal_zone *data = tz->devdata; | ||||
|  | ||||
|  	struct __thermal_zone *data = tz->devdata; | ||||
|   | ||||
| -	if (!data->ops->get_trend) | ||||
| +	if (!data->ops->get_trend || (data->mode == THERMAL_DEVICE_DISABLED)) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| 	return data->ops->get_trend(data->sensor_data, trip, trend); | ||||
|  		return -EINVAL; | ||||
|   | ||||
|  	return data->ops->get_trend(data->sensor_data, trip, trend); | ||||
| @@ -286,7 +290,9 @@ static int of_thermal_set_mode(struct th | ||||
| 	mutex_unlock(&tz->lock); | ||||
|  | ||||
| 	data->mode = mode; | ||||
|  	mutex_unlock(&tz->lock); | ||||
|   | ||||
|  	data->mode = mode; | ||||
| -	thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED); | ||||
| + | ||||
| +	if (mode == THERMAL_DEVICE_ENABLED) | ||||
| +		thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED); | ||||
|  | ||||
| 	return 0; | ||||
|   | ||||
|  	return 0; | ||||
|  } | ||||
| @@ -296,7 +302,8 @@ static int of_thermal_get_trip_type(stru | ||||
|  { | ||||
| 	struct __thermal_zone *data = tz->devdata; | ||||
|  | ||||
|  	struct __thermal_zone *data = tz->devdata; | ||||
|   | ||||
| -	if (trip >= data->ntrips || trip < 0) | ||||
| +	if (trip >= data->ntrips || trip < 0 | ||||
| +				|| (data->mode == THERMAL_DEVICE_DISABLED)) | ||||
| 		return -EDOM; | ||||
|  | ||||
| 	*type = data->trips[trip].type; | ||||
|  		return -EDOM; | ||||
|   | ||||
|  	*type = data->trips[trip].type; | ||||
| @@ -304,12 +311,39 @@ static int of_thermal_get_trip_type(stru | ||||
| 	return 0; | ||||
|  	return 0; | ||||
|  } | ||||
|  | ||||
|   | ||||
| +static int of_thermal_activate_trip_type(struct thermal_zone_device *tz, | ||||
| +			int trip, enum thermal_trip_activation_mode mode) | ||||
| +{ | ||||
| @@ -131,109 +131,109 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org> | ||||
| +} | ||||
| + | ||||
|  static int of_thermal_get_trip_temp(struct thermal_zone_device *tz, int trip, | ||||
| 				    int *temp) | ||||
|  				    int *temp) | ||||
|  { | ||||
| 	struct __thermal_zone *data = tz->devdata; | ||||
|  | ||||
|  	struct __thermal_zone *data = tz->devdata; | ||||
|   | ||||
| -	if (trip >= data->ntrips || trip < 0) | ||||
| +	if (trip >= data->ntrips || trip < 0 | ||||
| +				|| (data->mode == THERMAL_DEVICE_DISABLED)) | ||||
| 		return -EDOM; | ||||
|  | ||||
| 	*temp = data->trips[trip].temperature; | ||||
|  		return -EDOM; | ||||
|   | ||||
|  	*temp = data->trips[trip].temperature; | ||||
| @@ -322,7 +356,8 @@ static int of_thermal_set_trip_temp(stru | ||||
|  { | ||||
| 	struct __thermal_zone *data = tz->devdata; | ||||
|  | ||||
|  	struct __thermal_zone *data = tz->devdata; | ||||
|   | ||||
| -	if (trip >= data->ntrips || trip < 0) | ||||
| +	if (trip >= data->ntrips || trip < 0 | ||||
| +				|| (data->mode == THERMAL_DEVICE_DISABLED)) | ||||
| 		return -EDOM; | ||||
|  | ||||
| 	if (data->ops->set_trip_temp) { | ||||
|  		return -EDOM; | ||||
|   | ||||
|  	if (data->ops->set_trip_temp) { | ||||
| @@ -344,7 +379,8 @@ static int of_thermal_get_trip_hyst(stru | ||||
|  { | ||||
| 	struct __thermal_zone *data = tz->devdata; | ||||
|  | ||||
|  	struct __thermal_zone *data = tz->devdata; | ||||
|   | ||||
| -	if (trip >= data->ntrips || trip < 0) | ||||
| +	if (trip >= data->ntrips || trip < 0 | ||||
| +				|| (data->mode == THERMAL_DEVICE_DISABLED)) | ||||
| 		return -EDOM; | ||||
|  | ||||
| 	*hyst = data->trips[trip].hysteresis; | ||||
|  		return -EDOM; | ||||
|   | ||||
|  	*hyst = data->trips[trip].hysteresis; | ||||
| @@ -357,7 +393,8 @@ static int of_thermal_set_trip_hyst(stru | ||||
|  { | ||||
| 	struct __thermal_zone *data = tz->devdata; | ||||
|  | ||||
|  	struct __thermal_zone *data = tz->devdata; | ||||
|   | ||||
| -	if (trip >= data->ntrips || trip < 0) | ||||
| +	if (trip >= data->ntrips || trip < 0 | ||||
| +				|| (data->mode == THERMAL_DEVICE_DISABLED)) | ||||
| 		return -EDOM; | ||||
|  | ||||
| 	/* thermal framework should take care of data->mask & (1 << trip) */ | ||||
|  		return -EDOM; | ||||
|   | ||||
|  	/* thermal framework should take care of data->mask & (1 << trip) */ | ||||
| @@ -432,6 +469,9 @@ thermal_zone_of_add_sensor(struct device | ||||
| 	if (ops->set_emul_temp) | ||||
| 		tzd->ops->set_emul_temp = of_thermal_set_emul_temp; | ||||
|  | ||||
|  	if (ops->set_emul_temp) | ||||
|  		tzd->ops->set_emul_temp = of_thermal_set_emul_temp; | ||||
|   | ||||
| +	if (ops->set_trip_activate) | ||||
| +		tzd->ops->set_trip_activate = of_thermal_activate_trip_type; | ||||
| + | ||||
| 	mutex_unlock(&tzd->lock); | ||||
|  | ||||
| 	return tzd; | ||||
|  	mutex_unlock(&tzd->lock); | ||||
|   | ||||
|  	return tzd; | ||||
| @@ -726,7 +766,10 @@ static const char * const trip_types[] = | ||||
| 	[THERMAL_TRIP_ACTIVE]	= "active", | ||||
| 	[THERMAL_TRIP_PASSIVE]	= "passive", | ||||
| 	[THERMAL_TRIP_HOT]	= "hot", | ||||
|  	[THERMAL_TRIP_ACTIVE]	= "active", | ||||
|  	[THERMAL_TRIP_PASSIVE]	= "passive", | ||||
|  	[THERMAL_TRIP_HOT]	= "hot", | ||||
| -	[THERMAL_TRIP_CRITICAL]	= "critical", | ||||
| +	[THERMAL_TRIP_CRITICAL]	= "critical_high", | ||||
| +	[THERMAL_TRIP_CONFIGURABLE_HI] = "configurable_hi", | ||||
| +	[THERMAL_TRIP_CONFIGURABLE_LOW] = "configurable_lo", | ||||
| +	[THERMAL_TRIP_CRITICAL_LOW] = "critical_low", | ||||
|  }; | ||||
|  | ||||
|   | ||||
|  /** | ||||
| --- a/drivers/thermal/qcom/tsens.c | ||||
| +++ b/drivers/thermal/qcom/tsens.c | ||||
| @@ -31,7 +31,7 @@ static int tsens_get_temp(void *data, in | ||||
|  | ||||
|   | ||||
|  static int tsens_get_trend(void *p, int trip, enum thermal_trend *trend) | ||||
|  { | ||||
| -	const struct tsens_sensor *s = p; | ||||
| +	struct tsens_sensor *s = p; | ||||
| 	struct tsens_device *tmdev = s->tmdev; | ||||
|  | ||||
| 	if (tmdev->ops->get_trend) | ||||
|  	struct tsens_device *tmdev = s->tmdev; | ||||
|   | ||||
|  	if (tmdev->ops->get_trend) | ||||
| @@ -40,9 +40,10 @@ static int tsens_get_trend(void *p, int | ||||
| 	return -ENOTSUPP; | ||||
|  	return -ENOTSUPP; | ||||
|  } | ||||
|  | ||||
|   | ||||
| -static int  __maybe_unused tsens_suspend(struct device *dev) | ||||
| +static int  __maybe_unused tsens_suspend(void *data) | ||||
|  { | ||||
| -	struct tsens_device *tmdev = dev_get_drvdata(dev); | ||||
| +	struct tsens_sensor *s = data; | ||||
| +	struct tsens_device *tmdev = s->tmdev; | ||||
|  | ||||
| 	if (tmdev->ops && tmdev->ops->suspend) | ||||
| 		return tmdev->ops->suspend(tmdev); | ||||
|   | ||||
|  	if (tmdev->ops && tmdev->ops->suspend) | ||||
|  		return tmdev->ops->suspend(tmdev); | ||||
| @@ -50,9 +51,10 @@ static int  __maybe_unused tsens_suspend | ||||
| 	return 0; | ||||
|  	return 0; | ||||
|  } | ||||
|  | ||||
|   | ||||
| -static int __maybe_unused tsens_resume(struct device *dev) | ||||
| +static int __maybe_unused tsens_resume(void *data) | ||||
|  { | ||||
| -	struct tsens_device *tmdev = dev_get_drvdata(dev); | ||||
| +	struct tsens_sensor *s = data; | ||||
| +	struct tsens_device *tmdev = s->tmdev; | ||||
|  | ||||
| 	if (tmdev->ops && tmdev->ops->resume) | ||||
| 		return tmdev->ops->resume(tmdev); | ||||
|   | ||||
|  	if (tmdev->ops && tmdev->ops->resume) | ||||
|  		return tmdev->ops->resume(tmdev); | ||||
| @@ -60,6 +62,30 @@ static int __maybe_unused tsens_resume(s | ||||
| 	return 0; | ||||
|  	return 0; | ||||
|  } | ||||
|  | ||||
|   | ||||
| +static int  __maybe_unused tsens_set_trip_temp(void *data, int trip, int temp) | ||||
| +{ | ||||
| +	struct tsens_sensor *s = data; | ||||
| @@ -259,50 +259,50 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org> | ||||
| + | ||||
| + | ||||
|  static SIMPLE_DEV_PM_OPS(tsens_pm_ops, tsens_suspend, tsens_resume); | ||||
|  | ||||
|   | ||||
|  static const struct of_device_id tsens_table[] = { | ||||
| @@ -83,6 +109,8 @@ MODULE_DEVICE_TABLE(of, tsens_table); | ||||
|  static const struct thermal_zone_of_device_ops tsens_of_ops = { | ||||
| 	.get_temp = tsens_get_temp, | ||||
| 	.get_trend = tsens_get_trend, | ||||
|  	.get_temp = tsens_get_temp, | ||||
|  	.get_trend = tsens_get_trend, | ||||
| +	.set_trip_temp = tsens_set_trip_temp, | ||||
| +	.set_trip_activate = tsens_activate_trip_type, | ||||
|  }; | ||||
|  | ||||
|   | ||||
|  static int tsens_register(struct tsens_device *tmdev) | ||||
| @@ -131,7 +159,7 @@ static int tsens_probe(struct platform_d | ||||
| 	if (id) | ||||
| 		data = id->data; | ||||
| 	else | ||||
|  	if (id) | ||||
|  		data = id->data; | ||||
|  	else | ||||
| -		data = &data_8960; | ||||
| +		return -EINVAL; | ||||
|  | ||||
| 	if (data->num_sensors <= 0) { | ||||
| 		dev_err(dev, "invalid number of sensors\n"); | ||||
|   | ||||
|  	if (data->num_sensors <= 0) { | ||||
|  		dev_err(dev, "invalid number of sensors\n"); | ||||
| @@ -146,6 +174,9 @@ static int tsens_probe(struct platform_d | ||||
| 	tmdev->dev = dev; | ||||
| 	tmdev->num_sensors = data->num_sensors; | ||||
| 	tmdev->ops = data->ops; | ||||
|  	tmdev->dev = dev; | ||||
|  	tmdev->num_sensors = data->num_sensors; | ||||
|  	tmdev->ops = data->ops; | ||||
| + | ||||
| +	tmdev->tsens_irq = platform_get_irq(pdev, 0); | ||||
| + | ||||
| 	for (i = 0;  i < tmdev->num_sensors; i++) { | ||||
| 		if (data->hw_ids) | ||||
| 			tmdev->sensor[i].hw_id = data->hw_ids[i]; | ||||
|  	for (i = 0;  i < tmdev->num_sensors; i++) { | ||||
|  		if (data->hw_ids) | ||||
|  			tmdev->sensor[i].hw_id = data->hw_ids[i]; | ||||
| --- a/drivers/thermal/qcom/tsens.h | ||||
| +++ b/drivers/thermal/qcom/tsens.h | ||||
| @@ -24,9 +24,12 @@ struct tsens_device; | ||||
|  struct tsens_sensor { | ||||
| 	struct tsens_device		*tmdev; | ||||
| 	struct thermal_zone_device	*tzd; | ||||
|  	struct tsens_device		*tmdev; | ||||
|  	struct thermal_zone_device	*tzd; | ||||
| +	struct work_struct		notify_work; | ||||
| 	int				offset; | ||||
| 	int				id; | ||||
| 	int				hw_id; | ||||
|  	int				offset; | ||||
|  	int				id; | ||||
|  	int				hw_id; | ||||
| +	int				calib_data; | ||||
| +	int				calib_data_backup; | ||||
| 	int				slope; | ||||
| 	u32				status; | ||||
|  	int				slope; | ||||
|  	u32				status; | ||||
|  }; | ||||
| @@ -41,6 +44,9 @@ struct tsens_sensor { | ||||
|   * @suspend: Function to suspend the tsens device | ||||
| @@ -313,48 +313,48 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org> | ||||
| + * @set_trip_activate: Function to activate trip points | ||||
|   */ | ||||
|  struct tsens_ops { | ||||
| 	/* mandatory callbacks */ | ||||
|  	/* mandatory callbacks */ | ||||
| @@ -53,6 +59,9 @@ struct tsens_ops { | ||||
| 	int (*suspend)(struct tsens_device *); | ||||
| 	int (*resume)(struct tsens_device *); | ||||
| 	int (*get_trend)(struct tsens_device *, int, enum thermal_trend *); | ||||
|  	int (*suspend)(struct tsens_device *); | ||||
|  	int (*resume)(struct tsens_device *); | ||||
|  	int (*get_trend)(struct tsens_device *, int, enum thermal_trend *); | ||||
| +	int (*set_trip_temp)(void *, int, int); | ||||
| +	int (*set_trip_activate)(void *, int, | ||||
| +					enum thermal_trip_activation_mode); | ||||
|  }; | ||||
|  | ||||
|   | ||||
|  /** | ||||
| @@ -76,11 +85,13 @@ struct tsens_context { | ||||
|  struct tsens_device { | ||||
| 	struct device			*dev; | ||||
| 	u32				num_sensors; | ||||
|  	struct device			*dev; | ||||
|  	u32				num_sensors; | ||||
| +	u32				tsens_irq; | ||||
| 	struct regmap			*map; | ||||
| 	struct regmap_field		*status_field; | ||||
| 	struct tsens_context		ctx; | ||||
| 	bool				trdy; | ||||
| 	const struct tsens_ops		*ops; | ||||
|  	struct regmap			*map; | ||||
|  	struct regmap_field		*status_field; | ||||
|  	struct tsens_context		ctx; | ||||
|  	bool				trdy; | ||||
|  	const struct tsens_ops		*ops; | ||||
| +	struct work_struct		tsens_work; | ||||
| 	struct tsens_sensor		sensor[0]; | ||||
|  	struct tsens_sensor		sensor[0]; | ||||
|  }; | ||||
|  | ||||
|   | ||||
| --- a/drivers/thermal/thermal_sysfs.c | ||||
| +++ b/drivers/thermal/thermal_sysfs.c | ||||
| @@ -115,12 +115,48 @@ | ||||
| 		return sprintf(buf, "passive\n"); | ||||
| 	case THERMAL_TRIP_ACTIVE: | ||||
| 		return sprintf(buf, "active\n"); | ||||
| @@ -115,12 +115,48 @@ trip_point_type_show(struct device *dev, | ||||
|  		return sprintf(buf, "passive\n"); | ||||
|  	case THERMAL_TRIP_ACTIVE: | ||||
|  		return sprintf(buf, "active\n"); | ||||
| +	case THERMAL_TRIP_CONFIGURABLE_HI: | ||||
| +		return sprintf(buf, "configurable_hi\n"); | ||||
| +	case THERMAL_TRIP_CONFIGURABLE_LOW: | ||||
| +		return sprintf(buf, "configurable_low\n"); | ||||
| +	case THERMAL_TRIP_CRITICAL_LOW: | ||||
| +		return sprintf(buf, "critical_low\n"); | ||||
| 	default: | ||||
| 		return sprintf(buf, "unknown\n"); | ||||
| 	} | ||||
|  	default: | ||||
|  		return sprintf(buf, "unknown\n"); | ||||
|  	} | ||||
|  } | ||||
|  | ||||
|   | ||||
|  static ssize_t | ||||
| +trip_point_type_activate(struct device *dev, struct device_attribute *attr, | ||||
| +						const char *buf, size_t count) | ||||
| @@ -387,52 +387,52 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org> | ||||
| + | ||||
| +static ssize_t | ||||
|  trip_point_temp_store(struct device *dev, struct device_attribute *attr, | ||||
| 		      const char *buf, size_t count) | ||||
|  		      const char *buf, size_t count) | ||||
|  { | ||||
| @@ -562,6 +598,12 @@ | ||||
| 		tz->trip_type_attrs[indx].attr.show = trip_point_type_show; | ||||
| 		attrs[indx] = &tz->trip_type_attrs[indx].attr.attr; | ||||
|  | ||||
| @@ -562,6 +598,12 @@ static int create_trip_attrs(struct ther | ||||
|  		tz->trip_type_attrs[indx].attr.show = trip_point_type_show; | ||||
|  		attrs[indx] = &tz->trip_type_attrs[indx].attr.attr; | ||||
|   | ||||
| +		if (IS_ENABLED(CONFIG_THERMAL_WRITABLE_TRIPS)) { | ||||
| +			tz->trip_type_attrs[indx].attr.store | ||||
| +						= trip_point_type_activate; | ||||
| +			tz->trip_type_attrs[indx].attr.attr.mode |= S_IWUSR; | ||||
| +		} | ||||
| + | ||||
| 		/* create trip temp attribute */ | ||||
| 		snprintf(tz->trip_temp_attrs[indx].name, THERMAL_NAME_LENGTH, | ||||
| 			 "trip_point_%d_temp", indx); | ||||
|  		/* create trip temp attribute */ | ||||
|  		snprintf(tz->trip_temp_attrs[indx].name, THERMAL_NAME_LENGTH, | ||||
|  			 "trip_point_%d_temp", indx); | ||||
| --- a/include/linux/thermal.h | ||||
| +++ b/include/linux/thermal.h | ||||
| @@ -78,11 +78,19 @@ enum thermal_device_mode { | ||||
| 	THERMAL_DEVICE_ENABLED, | ||||
|  	THERMAL_DEVICE_ENABLED, | ||||
|  }; | ||||
|  | ||||
|   | ||||
| +enum thermal_trip_activation_mode { | ||||
| +	THERMAL_TRIP_ACTIVATION_DISABLED = 0, | ||||
| +	THERMAL_TRIP_ACTIVATION_ENABLED, | ||||
| +}; | ||||
| + | ||||
|  enum thermal_trip_type { | ||||
| 	THERMAL_TRIP_ACTIVE = 0, | ||||
| 	THERMAL_TRIP_PASSIVE, | ||||
| 	THERMAL_TRIP_HOT, | ||||
| 	THERMAL_TRIP_CRITICAL, | ||||
|  	THERMAL_TRIP_ACTIVE = 0, | ||||
|  	THERMAL_TRIP_PASSIVE, | ||||
|  	THERMAL_TRIP_HOT, | ||||
|  	THERMAL_TRIP_CRITICAL, | ||||
| +	THERMAL_TRIP_CONFIGURABLE_HI, | ||||
| +	THERMAL_TRIP_CONFIGURABLE_LOW, | ||||
| +	THERMAL_TRIP_CRITICAL_LOW, | ||||
|  }; | ||||
|  | ||||
|   | ||||
|  enum thermal_trend { | ||||
| @@ -120,6 +128,8 @@ struct thermal_zone_device_ops { | ||||
| 		enum thermal_trip_type *); | ||||
| 	int (*get_trip_temp) (struct thermal_zone_device *, int, int *); | ||||
| 	int (*set_trip_temp) (struct thermal_zone_device *, int, int); | ||||
|  		enum thermal_trip_type *); | ||||
|  	int (*get_trip_temp) (struct thermal_zone_device *, int, int *); | ||||
|  	int (*set_trip_temp) (struct thermal_zone_device *, int, int); | ||||
| +	int (*set_trip_activate) (struct thermal_zone_device *, int, | ||||
| +					enum thermal_trip_activation_mode); | ||||
| 	int (*get_trip_hyst) (struct thermal_zone_device *, int, int *); | ||||
| 	int (*set_trip_hyst) (struct thermal_zone_device *, int, int); | ||||
| 	int (*get_crit_temp) (struct thermal_zone_device *, int *); | ||||
|  	int (*get_trip_hyst) (struct thermal_zone_device *, int, int *); | ||||
|  	int (*set_trip_hyst) (struct thermal_zone_device *, int, int); | ||||
|  	int (*get_crit_temp) (struct thermal_zone_device *, int *); | ||||
| @@ -363,6 +373,8 @@ struct thermal_genl_event { | ||||
|   *		   temperature. | ||||
|   * @set_trip_temp: a pointer to a function that sets the trip temperature on | ||||
| @@ -441,13 +441,13 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org> | ||||
| + *		temperature interrupts | ||||
|   */ | ||||
|  struct thermal_zone_of_device_ops { | ||||
| 	int (*get_temp)(void *, int *); | ||||
|  	int (*get_temp)(void *, int *); | ||||
| @@ -370,6 +382,8 @@ struct thermal_zone_of_device_ops { | ||||
| 	int (*set_trips)(void *, int, int); | ||||
| 	int (*set_emul_temp)(void *, int); | ||||
| 	int (*set_trip_temp)(void *, int, int); | ||||
|  	int (*set_trips)(void *, int, int); | ||||
|  	int (*set_emul_temp)(void *, int); | ||||
|  	int (*set_trip_temp)(void *, int, int); | ||||
| +	int (*set_trip_activate)(void *, int, | ||||
| +				enum thermal_trip_activation_mode); | ||||
|  }; | ||||
|  | ||||
|   | ||||
|  /** | ||||
|   | ||||
| @@ -13,19 +13,19 @@ Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- a/Documentation/devicetree/bindings/clock/qcom,rpmcc.txt | ||||
| +++ b/Documentation/devicetree/bindings/clock/qcom,rpmcc.txt | ||||
| @@ -13,6 +13,7 @@ Required properties : | ||||
| 			"qcom,rpmcc-msm8916", "qcom,rpmcc" | ||||
| 			"qcom,rpmcc-msm8974", "qcom,rpmcc" | ||||
| 			"qcom,rpmcc-apq8064", "qcom,rpmcc" | ||||
|  			"qcom,rpmcc-msm8916", "qcom,rpmcc" | ||||
|  			"qcom,rpmcc-msm8974", "qcom,rpmcc" | ||||
|  			"qcom,rpmcc-apq8064", "qcom,rpmcc" | ||||
| +			"qcom,rpmcc-ipq806x", "qcom,rpmcc" | ||||
|  | ||||
|   | ||||
|  - #clock-cells : shall contain 1 | ||||
|  | ||||
|   | ||||
| --- a/drivers/clk/qcom/clk-rpm.c | ||||
| +++ b/drivers/clk/qcom/clk-rpm.c | ||||
| @@ -359,6 +359,16 @@ DEFINE_CLK_RPM(apq8064, sfab_clk, sfab_a | ||||
|  DEFINE_CLK_RPM(apq8064, sfpb_clk, sfpb_a_clk, QCOM_RPM_SFPB_CLK); | ||||
|  DEFINE_CLK_RPM(apq8064, qdss_clk, qdss_a_clk, QCOM_RPM_QDSS_CLK); | ||||
|  | ||||
|   | ||||
| +/* ipq806x */ | ||||
| +DEFINE_CLK_RPM(ipq806x, afab_clk, afab_a_clk, QCOM_RPM_APPS_FABRIC_CLK); | ||||
| +DEFINE_CLK_RPM(ipq806x, cfpb_clk, cfpb_a_clk, QCOM_RPM_CFPB_CLK); | ||||
| @@ -37,12 +37,12 @@ Signed-off-by: John Crispin <john@phrozen.org> | ||||
| +DEFINE_CLK_RPM(ipq806x, nss_fabric_1_clk, nss_fabric_1_a_clk, QCOM_RPM_NSS_FABRIC_1_CLK); | ||||
| + | ||||
|  static struct clk_rpm *apq8064_clks[] = { | ||||
| 	[RPM_APPS_FABRIC_CLK] = &apq8064_afab_clk, | ||||
| 	[RPM_APPS_FABRIC_A_CLK] = &apq8064_afab_a_clk, | ||||
|  	[RPM_APPS_FABRIC_CLK] = &apq8064_afab_clk, | ||||
|  	[RPM_APPS_FABRIC_A_CLK] = &apq8064_afab_a_clk, | ||||
| @@ -380,13 +390,38 @@ static struct clk_rpm *apq8064_clks[] = | ||||
| 	[RPM_QDSS_A_CLK] = &apq8064_qdss_a_clk, | ||||
|  	[RPM_QDSS_A_CLK] = &apq8064_qdss_a_clk, | ||||
|  }; | ||||
|  | ||||
|   | ||||
| +static struct clk_rpm *ipq806x_clks[] = { | ||||
| +	[RPM_APPS_FABRIC_CLK] = &ipq806x_afab_clk, | ||||
| +	[RPM_APPS_FABRIC_A_CLK] = &ipq806x_afab_a_clk, | ||||
| @@ -63,19 +63,19 @@ Signed-off-by: John Crispin <john@phrozen.org> | ||||
| +}; | ||||
| + | ||||
|  static const struct rpm_clk_desc rpm_clk_apq8064 = { | ||||
| 	.clks = apq8064_clks, | ||||
| 	.num_clks = ARRAY_SIZE(apq8064_clks), | ||||
|  	.clks = apq8064_clks, | ||||
|  	.num_clks = ARRAY_SIZE(apq8064_clks), | ||||
|  }; | ||||
|  | ||||
|   | ||||
| +static const struct rpm_clk_desc rpm_clk_ipq806x = { | ||||
| +	.clks = ipq806x_clks, | ||||
| +	.num_clks = ARRAY_SIZE(ipq806x_clks), | ||||
| +}; | ||||
| + | ||||
|  static const struct of_device_id rpm_clk_match_table[] = { | ||||
| 	{ .compatible = "qcom,rpmcc-apq8064", .data = &rpm_clk_apq8064 }, | ||||
|  	{ .compatible = "qcom,rpmcc-apq8064", .data = &rpm_clk_apq8064 }, | ||||
| +	{ .compatible = "qcom,rpmcc-ipq806x", .data = &rpm_clk_ipq806x }, | ||||
| 	{ } | ||||
|  	{ } | ||||
|  }; | ||||
|  MODULE_DEVICE_TABLE(of, rpm_clk_match_table); | ||||
| --- a/include/dt-bindings/clock/qcom,rpmcc.h | ||||
| @@ -88,6 +88,6 @@ Signed-off-by: John Crispin <john@phrozen.org> | ||||
| +#define RPM_NSS_FABRIC_0_A_CLK				23 | ||||
| +#define RPM_NSS_FABRIC_1_CLK				24 | ||||
| +#define RPM_NSS_FABRIC_1_A_CLK				25 | ||||
|  | ||||
|   | ||||
|  /* SMD RPM clocks */ | ||||
|  #define RPM_SMD_XO_CLK_SRC				0 | ||||
|   | ||||
| @@ -19,12 +19,12 @@ Signed-off-by: John Crispin <blogic@openwrt.org> | ||||
|  #include <linux/gpio/machine.h> | ||||
| +#include <linux/init.h> | ||||
| +#include <linux/platform_device.h> | ||||
|  | ||||
|   | ||||
|  #include "gpiolib.h" | ||||
|  | ||||
|   | ||||
| @@ -506,3 +508,69 @@ void of_gpiochip_remove(struct gpio_chip | ||||
| 	gpiochip_remove_pin_ranges(chip); | ||||
| 	of_node_put(chip->of_node); | ||||
|  	gpiochip_remove_pin_ranges(chip); | ||||
|  	of_node_put(chip->of_node); | ||||
|  } | ||||
| + | ||||
| +static struct of_device_id gpio_export_ids[] = { | ||||
| @@ -101,20 +101,20 @@ Signed-off-by: John Crispin <blogic@openwrt.org> | ||||
| -int gpiod_export(struct gpio_desc *desc, bool direction_may_change) | ||||
| +int __gpiod_export(struct gpio_desc *desc, bool direction_may_change, const char *name) | ||||
|  { | ||||
| 	struct gpio_chip	*chip; | ||||
| 	struct gpio_device	*gdev; | ||||
|  	struct gpio_chip	*chip; | ||||
|  	struct gpio_device	*gdev; | ||||
| @@ -615,6 +615,8 @@ int gpiod_export(struct gpio_desc *desc, | ||||
| 	offset = gpio_chip_hwgpio(desc); | ||||
| 	if (chip->names && chip->names[offset]) | ||||
| 		ioname = chip->names[offset]; | ||||
|  	offset = gpio_chip_hwgpio(desc); | ||||
|  	if (chip->names && chip->names[offset]) | ||||
|  		ioname = chip->names[offset]; | ||||
| +	if (name) | ||||
| +		ioname = name; | ||||
|  | ||||
| 	dev = device_create_with_groups(&gpio_class, &gdev->dev, | ||||
| 					MKDEV(0, 0), data, gpio_groups, | ||||
|   | ||||
|  	dev = device_create_with_groups(&gpio_class, &gdev->dev, | ||||
|  					MKDEV(0, 0), data, gpio_groups, | ||||
| @@ -636,6 +638,12 @@ err_unlock: | ||||
| 	gpiod_dbg(desc, "%s: status %d\n", __func__, status); | ||||
| 	return status; | ||||
|  	gpiod_dbg(desc, "%s: status %d\n", __func__, status); | ||||
|  	return status; | ||||
|  } | ||||
| +EXPORT_SYMBOL_GPL(__gpiod_export); | ||||
| + | ||||
| @@ -123,14 +123,14 @@ Signed-off-by: John Crispin <blogic@openwrt.org> | ||||
| +	return __gpiod_export(desc, direction_may_change, NULL); | ||||
| +} | ||||
|  EXPORT_SYMBOL_GPL(gpiod_export); | ||||
|  | ||||
|   | ||||
|  static int match_export(struct device *dev, const void *desc) | ||||
| --- a/include/asm-generic/gpio.h | ||||
| +++ b/include/asm-generic/gpio.h | ||||
| @@ -127,6 +127,12 @@ static inline int gpio_export(unsigned g | ||||
| 	return gpiod_export(gpio_to_desc(gpio), direction_may_change); | ||||
|  	return gpiod_export(gpio_to_desc(gpio), direction_may_change); | ||||
|  } | ||||
|  | ||||
|   | ||||
| +int __gpiod_export(struct gpio_desc *desc, bool direction_may_change, const char *name); | ||||
| +static inline int gpio_export_with_name(unsigned gpio, bool direction_may_change, const char *name) | ||||
| +{ | ||||
| @@ -138,22 +138,22 @@ Signed-off-by: John Crispin <blogic@openwrt.org> | ||||
| +} | ||||
| + | ||||
|  static inline int gpio_export_link(struct device *dev, const char *name, | ||||
| 				   unsigned gpio) | ||||
|  				   unsigned gpio) | ||||
|  { | ||||
| --- a/include/linux/gpio/consumer.h | ||||
| +++ b/include/linux/gpio/consumer.h | ||||
| @@ -451,6 +451,7 @@ static inline struct gpio_desc *devm_get | ||||
|  | ||||
| @@ -451,6 +451,7 @@ struct gpio_desc *devm_fwnode_get_gpiod_ | ||||
|   | ||||
|  #if IS_ENABLED(CONFIG_GPIOLIB) && IS_ENABLED(CONFIG_GPIO_SYSFS) | ||||
|  | ||||
|   | ||||
| +int _gpiod_export(struct gpio_desc *desc, bool direction_may_change, const char *name); | ||||
|  int gpiod_export(struct gpio_desc *desc, bool direction_may_change); | ||||
|  int gpiod_export_link(struct device *dev, const char *name, | ||||
| 		      struct gpio_desc *desc); | ||||
|  		      struct gpio_desc *desc); | ||||
| @@ -458,6 +459,13 @@ void gpiod_unexport(struct gpio_desc *de | ||||
|  | ||||
|   | ||||
|  #else  /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */ | ||||
|  | ||||
|   | ||||
| +static inline int _gpiod_export(struct gpio_desc *desc, | ||||
| +			       bool direction_may_change, | ||||
| +			       const char *name) | ||||
| @@ -162,5 +162,5 @@ Signed-off-by: John Crispin <blogic@openwrt.org> | ||||
| +} | ||||
| + | ||||
|  static inline int gpiod_export(struct gpio_desc *desc, | ||||
| 			       bool direction_may_change) | ||||
|  			       bool direction_may_change) | ||||
|  { | ||||
|   | ||||
| @@ -23,9 +23,9 @@ Signed-off-by: Adrian Panella <ianchi74@outlook.com> | ||||
| --- a/arch/arm/Kconfig | ||||
| +++ b/arch/arm/Kconfig | ||||
| @@ -1938,6 +1938,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. | ||||
|  | ||||
|  	  The command-line arguments provided by the boot loader will be | ||||
|  	  appended to the the device tree bootargs property. | ||||
|   | ||||
| +config ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE | ||||
| +	bool "Append rootblock parsing bootloader's kernel arguments" | ||||
| +	help | ||||
| @@ -38,12 +38,12 @@ Signed-off-by: Adrian Panella <ianchi74@outlook.com> | ||||
| +	  sent by bootloader will be ignored. | ||||
| + | ||||
|  endchoice | ||||
|  | ||||
|   | ||||
|  config CMDLINE | ||||
| --- a/arch/arm/boot/compressed/atags_to_fdt.c | ||||
| +++ b/arch/arm/boot/compressed/atags_to_fdt.c | ||||
| @@ -4,6 +4,8 @@ | ||||
|  | ||||
|   | ||||
|  #if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND) | ||||
|  #define do_extend_cmdline 1 | ||||
| +#elif defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) | ||||
| @@ -52,9 +52,9 @@ Signed-off-by: Adrian Panella <ianchi74@outlook.com> | ||||
|  #define do_extend_cmdline 0 | ||||
|  #endif | ||||
| @@ -67,6 +69,59 @@ static uint32_t get_cell_size(const void | ||||
| 	return cell_size; | ||||
|  	return cell_size; | ||||
|  } | ||||
|  | ||||
|   | ||||
| +#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) | ||||
| + | ||||
| +static char *append_rootblock(char *dest, const char *str, int len, void *fdt) | ||||
| @@ -110,11 +110,11 @@ Signed-off-by: Adrian Panella <ianchi74@outlook.com> | ||||
| + | ||||
|  static void merge_fdt_bootargs(void *fdt, const char *fdt_cmdline) | ||||
|  { | ||||
| 	char cmdline[COMMAND_LINE_SIZE]; | ||||
|  	char cmdline[COMMAND_LINE_SIZE]; | ||||
| @@ -86,12 +141,21 @@ static void merge_fdt_bootargs(void *fdt | ||||
|  | ||||
| 	/* and append the ATAG_CMDLINE */ | ||||
| 	if (fdt_cmdline) { | ||||
|   | ||||
|  	/* and append the ATAG_CMDLINE */ | ||||
|  	if (fdt_cmdline) { | ||||
| + | ||||
| +#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) | ||||
| +		//save original bootloader args | ||||
| @@ -123,55 +123,55 @@ Signed-off-by: Adrian Panella <ianchi74@outlook.com> | ||||
| +		ptr = append_rootblock(ptr, fdt_cmdline, len, fdt); | ||||
| + | ||||
| +#else | ||||
| 		len = strlen(fdt_cmdline); | ||||
| 		if (ptr - cmdline + len + 2 < COMMAND_LINE_SIZE) { | ||||
| 			*ptr++ = ' '; | ||||
| 			memcpy(ptr, fdt_cmdline, len); | ||||
| 			ptr += len; | ||||
| 		} | ||||
|  		len = strlen(fdt_cmdline); | ||||
|  		if (ptr - cmdline + len + 2 < COMMAND_LINE_SIZE) { | ||||
|  			*ptr++ = ' '; | ||||
|  			memcpy(ptr, fdt_cmdline, len); | ||||
|  			ptr += len; | ||||
|  		} | ||||
| +#endif | ||||
| 	} | ||||
| 	*ptr = '\0'; | ||||
|  | ||||
|  	} | ||||
|  	*ptr = '\0'; | ||||
|   | ||||
| @@ -148,7 +212,9 @@ int atags_to_fdt(void *atag_list, void * | ||||
| 			else | ||||
| 				setprop_string(fdt, "/chosen", "bootargs", | ||||
| 					       atag->u.cmdline.cmdline); | ||||
|  			else | ||||
|  				setprop_string(fdt, "/chosen", "bootargs", | ||||
|  					       atag->u.cmdline.cmdline); | ||||
| -		} else if (atag->hdr.tag == ATAG_MEM) { | ||||
| +		} | ||||
| +#ifndef CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE | ||||
| +		else if (atag->hdr.tag == ATAG_MEM) { | ||||
| 			if (memcount >= sizeof(mem_reg_property)/4) | ||||
| 				continue; | ||||
| 			if (!atag->u.mem.size) | ||||
|  			if (memcount >= sizeof(mem_reg_property)/4) | ||||
|  				continue; | ||||
|  			if (!atag->u.mem.size) | ||||
| @@ -187,6 +253,10 @@ int atags_to_fdt(void *atag_list, void * | ||||
| 		setprop(fdt, "/memory", "reg", mem_reg_property, | ||||
| 			4 * memcount * memsize); | ||||
| 	} | ||||
|  		setprop(fdt, "/memory", "reg", mem_reg_property, | ||||
|  			4 * memcount * memsize); | ||||
|  	} | ||||
| +#else | ||||
| + | ||||
| +	} | ||||
| +#endif | ||||
|  | ||||
| 	return fdt_pack(fdt); | ||||
|   | ||||
|  	return fdt_pack(fdt); | ||||
|  } | ||||
| --- a/init/main.c | ||||
| +++ b/init/main.c | ||||
| @@ -95,6 +95,10 @@ | ||||
|  #include <asm/sections.h> | ||||
|  #include <asm/cacheflush.h> | ||||
|  | ||||
|   | ||||
| +#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) | ||||
| +#include <linux/of.h> | ||||
| +#endif | ||||
| + | ||||
|  static int kernel_init(void *); | ||||
|  | ||||
|   | ||||
|  extern void init_IRQ(void); | ||||
| @@ -574,6 +578,18 @@ asmlinkage __visible void __init start_k | ||||
| 	page_alloc_init(); | ||||
|  | ||||
| 	pr_notice("Kernel command line: %s\n", boot_command_line); | ||||
|  	page_alloc_init(); | ||||
|   | ||||
|  	pr_notice("Kernel command line: %s\n", boot_command_line); | ||||
| + | ||||
| +#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) | ||||
| +	//Show bootloader's original command line for reference | ||||
| @@ -184,6 +184,6 @@ Signed-off-by: Adrian Panella <ianchi74@outlook.com> | ||||
| +	} | ||||
| +#endif | ||||
| + | ||||
| 	parse_early_param(); | ||||
| 	after_dashes = parse_args("Booting kernel", | ||||
| 				  static_command_line, __start___param, | ||||
|  	parse_early_param(); | ||||
|  	after_dashes = parse_args("Booting kernel", | ||||
|  				  static_command_line, __start___param, | ||||
|   | ||||
| @@ -11,9 +11,9 @@ Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- a/arch/arm/boot/dts/Makefile | ||||
| +++ b/arch/arm/boot/dts/Makefile | ||||
| @@ -699,6 +699,15 @@ dtb-$(CONFIG_ARCH_QCOM) += \ | ||||
| 	qcom-apq8084-mtp.dtb \ | ||||
| 	qcom-ipq4019-ap.dk01.1-c1.dtb \ | ||||
| 	qcom-ipq8064-ap148.dtb \ | ||||
|  	qcom-apq8084-mtp.dtb \ | ||||
|  	qcom-ipq4019-ap.dk01.1-c1.dtb \ | ||||
|  	qcom-ipq8064-ap148.dtb \ | ||||
| +	qcom-ipq8064-c2600.dtb \ | ||||
| +	qcom-ipq8064-d7800.dtb \ | ||||
| +	qcom-ipq8064-db149.dtb \ | ||||
| @@ -23,6 +23,6 @@ Signed-off-by: John Crispin <john@phrozen.org> | ||||
| +	qcom-ipq8064-wpq864.dtb \ | ||||
| +	qcom-ipq8065-nbg6817.dtb \ | ||||
| +	qcom-ipq8065-r7800.dtb \ | ||||
| 	qcom-msm8660-surf.dtb \ | ||||
| 	qcom-msm8960-cdp.dtb \ | ||||
| 	qcom-msm8974-lge-nexus5-hammerhead.dtb \ | ||||
|  	qcom-msm8660-surf.dtb \ | ||||
|  	qcom-msm8960-cdp.dtb \ | ||||
|  	qcom-msm8974-lge-nexus5-hammerhead.dtb \ | ||||
|   | ||||
| @@ -5,12 +5,12 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| --- a/drivers/soc/qcom/spm.c | ||||
| +++ b/drivers/soc/qcom/spm.c | ||||
| @@ -219,6 +219,9 @@ static int __init qcom_cpuidle_init(stru | ||||
| 	cpumask_t mask; | ||||
| 	bool use_scm_power_down = false; | ||||
|  | ||||
|  	cpumask_t mask; | ||||
|  	bool use_scm_power_down = false; | ||||
|   | ||||
| +	if (!qcom_scm_is_available()) | ||||
| +		return -EPROBE_DEFER; | ||||
| + | ||||
| 	for (i = 0; ; i++) { | ||||
| 		state_node = of_parse_phandle(cpu_node, "cpu-idle-states", i); | ||||
| 		if (!state_node) | ||||
|  	for (i = 0; ; i++) { | ||||
|  		state_node = of_parse_phandle(cpu_node, "cpu-idle-states", i); | ||||
|  		if (!state_node) | ||||
|   | ||||
| @@ -11,19 +11,19 @@ Signed-off-by: Sham Muthayyan <smuthayy@codeaurora.org> | ||||
|  | ||||
| --- a/drivers/pci/dwc/pcie-qcom.c | ||||
| +++ b/drivers/pci/dwc/pcie-qcom.c | ||||
| @@ -91,6 +91,8 @@ | ||||
| 	struct clk *iface_clk; | ||||
| 	struct clk *core_clk; | ||||
| 	struct clk *phy_clk; | ||||
| @@ -91,6 +91,8 @@ struct qcom_pcie_resources_2_1_0 { | ||||
|  	struct clk *iface_clk; | ||||
|  	struct clk *core_clk; | ||||
|  	struct clk *phy_clk; | ||||
| +	struct clk *aux_clk; | ||||
| +	struct clk *ref_clk; | ||||
| 	struct reset_control *pci_reset; | ||||
| 	struct reset_control *axi_reset; | ||||
| 	struct reset_control *ahb_reset; | ||||
| @@ -249,6 +251,14 @@ | ||||
| 	if (IS_ERR(res->phy_clk)) | ||||
| 		return PTR_ERR(res->phy_clk); | ||||
|  | ||||
|  	struct reset_control *pci_reset; | ||||
|  	struct reset_control *axi_reset; | ||||
|  	struct reset_control *ahb_reset; | ||||
| @@ -249,6 +251,14 @@ static int qcom_pcie_get_resources_2_1_0 | ||||
|  	if (IS_ERR(res->phy_clk)) | ||||
|  		return PTR_ERR(res->phy_clk); | ||||
|   | ||||
| +	res->aux_clk = devm_clk_get(dev, "aux"); | ||||
| +	if (IS_ERR(res->aux_clk)) | ||||
| +		return PTR_ERR(res->aux_clk); | ||||
| @@ -32,37 +32,37 @@ Signed-off-by: Sham Muthayyan <smuthayy@codeaurora.org> | ||||
| +	if (IS_ERR(res->ref_clk)) | ||||
| +		return PTR_ERR(res->ref_clk); | ||||
| + | ||||
| 	res->pci_reset = devm_reset_control_get_exclusive(dev, "pci"); | ||||
| 	if (IS_ERR(res->pci_reset)) | ||||
| 		return PTR_ERR(res->pci_reset); | ||||
| @@ -281,6 +291,8 @@ | ||||
| 	clk_disable_unprepare(res->iface_clk); | ||||
| 	clk_disable_unprepare(res->core_clk); | ||||
| 	clk_disable_unprepare(res->phy_clk); | ||||
|  	res->pci_reset = devm_reset_control_get_exclusive(dev, "pci"); | ||||
|  	if (IS_ERR(res->pci_reset)) | ||||
|  		return PTR_ERR(res->pci_reset); | ||||
| @@ -281,6 +291,8 @@ static void qcom_pcie_deinit_2_1_0(struc | ||||
|  	clk_disable_unprepare(res->iface_clk); | ||||
|  	clk_disable_unprepare(res->core_clk); | ||||
|  	clk_disable_unprepare(res->phy_clk); | ||||
| +	clk_disable_unprepare(res->aux_clk); | ||||
| +	clk_disable_unprepare(res->ref_clk); | ||||
| 	regulator_disable(res->vdda); | ||||
| 	regulator_disable(res->vdda_phy); | ||||
| 	regulator_disable(res->vdda_refclk); | ||||
| @@ -324,16 +336,28 @@ | ||||
| 		goto err_assert_ahb; | ||||
| 	} | ||||
|  | ||||
|  	regulator_disable(res->vdda); | ||||
|  	regulator_disable(res->vdda_phy); | ||||
|  	regulator_disable(res->vdda_refclk); | ||||
| @@ -324,16 +336,28 @@ static int qcom_pcie_init_2_1_0(struct q | ||||
|  		goto err_assert_ahb; | ||||
|  	} | ||||
|   | ||||
| +	ret = clk_prepare_enable(res->core_clk); | ||||
| +	if (ret) { | ||||
| +		dev_err(dev, "cannot prepare/enable core clock\n"); | ||||
| +		goto err_clk_core; | ||||
| +	} | ||||
| + | ||||
| 	ret = clk_prepare_enable(res->phy_clk); | ||||
| 	if (ret) { | ||||
| 		dev_err(dev, "cannot prepare/enable phy clock\n"); | ||||
| 		goto err_clk_phy; | ||||
| 	} | ||||
|  | ||||
|  	ret = clk_prepare_enable(res->phy_clk); | ||||
|  	if (ret) { | ||||
|  		dev_err(dev, "cannot prepare/enable phy clock\n"); | ||||
|  		goto err_clk_phy; | ||||
|  	} | ||||
|   | ||||
| -	ret = clk_prepare_enable(res->core_clk); | ||||
| +	ret = clk_prepare_enable(res->aux_clk); | ||||
| 	if (ret) { | ||||
|  	if (ret) { | ||||
| -		dev_err(dev, "cannot prepare/enable core clock\n"); | ||||
| -		goto err_clk_core; | ||||
| +		dev_err(dev, "cannot prepare/enable aux clock\n"); | ||||
| @@ -73,12 +73,12 @@ Signed-off-by: Sham Muthayyan <smuthayy@codeaurora.org> | ||||
| +	if (ret) { | ||||
| +		dev_err(dev, "cannot prepare/enable ref clock\n"); | ||||
| +		goto err_clk_ref; | ||||
| 	} | ||||
|  | ||||
| 	ret = reset_control_deassert(res->ahb_reset); | ||||
| @@ -389,10 +413,14 @@ | ||||
| 	return 0; | ||||
|  | ||||
|  	} | ||||
|   | ||||
|  	ret = reset_control_deassert(res->ahb_reset); | ||||
| @@ -389,10 +413,14 @@ static int qcom_pcie_init_2_1_0(struct q | ||||
|  	return 0; | ||||
|   | ||||
|  err_deassert_ahb: | ||||
| -	clk_disable_unprepare(res->core_clk); | ||||
| -err_clk_core: | ||||
| @@ -86,10 +86,10 @@ Signed-off-by: Sham Muthayyan <smuthayy@codeaurora.org> | ||||
| +err_clk_ref: | ||||
| +	clk_disable_unprepare(res->aux_clk); | ||||
| +err_clk_aux: | ||||
| 	clk_disable_unprepare(res->phy_clk); | ||||
|  	clk_disable_unprepare(res->phy_clk); | ||||
|  err_clk_phy: | ||||
| +	clk_disable_unprepare(res->core_clk); | ||||
| +err_clk_core: | ||||
| 	clk_disable_unprepare(res->iface_clk); | ||||
|  	clk_disable_unprepare(res->iface_clk); | ||||
|  err_assert_ahb: | ||||
| 	regulator_disable(res->vdda_phy); | ||||
|  	regulator_disable(res->vdda_phy); | ||||
|   | ||||
| @@ -11,7 +11,7 @@ Signed-off-by: Sham Muthayyan <smuthayy@codeaurora.org> | ||||
|  | ||||
| --- a/drivers/pci/dwc/pcie-qcom.c | ||||
| +++ b/drivers/pci/dwc/pcie-qcom.c | ||||
| @@ -98,6 +98,7 @@ | ||||
| @@ -98,6 +98,7 @@ struct qcom_pcie_resources_2_1_0 { | ||||
|  	struct reset_control *ahb_reset; | ||||
|  	struct reset_control *por_reset; | ||||
|  	struct reset_control *phy_reset; | ||||
| @@ -19,10 +19,10 @@ Signed-off-by: Sham Muthayyan <smuthayy@codeaurora.org> | ||||
|  	struct regulator *vdda; | ||||
|  	struct regulator *vdda_phy; | ||||
|  	struct regulator *vdda_refclk; | ||||
| @@ -275,6 +276,10 @@ | ||||
| @@ -275,6 +276,10 @@ static int qcom_pcie_get_resources_2_1_0 | ||||
|  	if (IS_ERR(res->por_reset)) | ||||
|  		return PTR_ERR(res->por_reset); | ||||
|  | ||||
|   | ||||
| +	res->ext_reset = devm_reset_control_get(dev, "ext"); | ||||
| +	if (IS_ERR(res->ext_reset)) | ||||
| +		return PTR_ERR(res->ext_reset); | ||||
| @@ -30,7 +30,7 @@ Signed-off-by: Sham Muthayyan <smuthayy@codeaurora.org> | ||||
|  	res->phy_reset = devm_reset_control_get_exclusive(dev, "phy"); | ||||
|  	return PTR_ERR_OR_ZERO(res->phy_reset); | ||||
|  } | ||||
| @@ -288,6 +293,7 @@ | ||||
| @@ -288,6 +293,7 @@ static void qcom_pcie_deinit_2_1_0(struc | ||||
|  	reset_control_assert(res->ahb_reset); | ||||
|  	reset_control_assert(res->por_reset); | ||||
|  	reset_control_assert(res->pci_reset); | ||||
| @@ -38,10 +38,10 @@ Signed-off-by: Sham Muthayyan <smuthayy@codeaurora.org> | ||||
|  	clk_disable_unprepare(res->iface_clk); | ||||
|  	clk_disable_unprepare(res->core_clk); | ||||
|  	clk_disable_unprepare(res->phy_clk); | ||||
| @@ -306,6 +312,12 @@ | ||||
| @@ -306,6 +312,12 @@ static int qcom_pcie_init_2_1_0(struct q | ||||
|  	u32 val; | ||||
|  	int ret; | ||||
|  | ||||
|   | ||||
| +	ret = reset_control_assert(res->ahb_reset); | ||||
| +	if (ret) { | ||||
| +		dev_err(dev, "cannot assert ahb reset\n"); | ||||
| @@ -51,10 +51,10 @@ Signed-off-by: Sham Muthayyan <smuthayy@codeaurora.org> | ||||
|  	ret = regulator_enable(res->vdda); | ||||
|  	if (ret) { | ||||
|  		dev_err(dev, "cannot enable vdda regulator\n"); | ||||
| @@ -324,16 +336,16 @@ | ||||
| @@ -324,16 +336,16 @@ static int qcom_pcie_init_2_1_0(struct q | ||||
|  		goto err_vdda_phy; | ||||
|  	} | ||||
|  | ||||
|   | ||||
| -	ret = reset_control_assert(res->ahb_reset); | ||||
| +	ret = reset_control_deassert(res->ext_reset); | ||||
|  	if (ret) { | ||||
| @@ -63,16 +63,16 @@ Signed-off-by: Sham Muthayyan <smuthayy@codeaurora.org> | ||||
| +		dev_err(dev, "cannot assert ext reset\n"); | ||||
| +		goto err_reset_ext; | ||||
|  	} | ||||
|  | ||||
|   | ||||
|  	ret = clk_prepare_enable(res->iface_clk); | ||||
|  	if (ret) { | ||||
|  		dev_err(dev, "cannot prepare/enable iface clock\n"); | ||||
| -		goto err_assert_ahb; | ||||
| +		goto err_iface; | ||||
|  	} | ||||
|  | ||||
|   | ||||
|  	ret = clk_prepare_enable(res->core_clk); | ||||
| @@ -422,7 +434,9 @@ | ||||
| @@ -422,7 +434,9 @@ err_clk_phy: | ||||
|  	clk_disable_unprepare(res->core_clk); | ||||
|  err_clk_core: | ||||
|  	clk_disable_unprepare(res->iface_clk); | ||||
|   | ||||
| @@ -13,7 +13,7 @@ Signed-off-by: Sham Muthayyan <smuthayy@codeaurora.org> | ||||
| +++ b/drivers/pci/dwc/pcie-qcom.c | ||||
| @@ -52,7 +52,13 @@ | ||||
|  #define PCIE_CAP_CPL_TIMEOUT_DISABLE		0x10 | ||||
|  | ||||
|   | ||||
|  #define PCIE20_PARF_PHY_CTRL			0x40 | ||||
| +#define PHY_CTRL_PHY_TX0_TERM_OFFSET_MASK	(0x1f << 16) | ||||
| +#define PHY_CTRL_PHY_TX0_TERM_OFFSET(x)		(x << 16) | ||||
| @@ -27,7 +27,7 @@ Signed-off-by: Sham Muthayyan <smuthayy@codeaurora.org> | ||||
|  #define PCIE20_PARF_MHI_CLOCK_RESET_CTRL	0x174 | ||||
| @@ -83,6 +89,18 @@ | ||||
|  #define DBI_RO_WR_EN				1 | ||||
|  | ||||
|   | ||||
|  #define PERST_DELAY_US				1000 | ||||
| +/* PARF registers */ | ||||
| +#define PCIE20_PARF_PCS_DEEMPH			0x34 | ||||
| @@ -41,21 +41,21 @@ Signed-off-by: Sham Muthayyan <smuthayy@codeaurora.org> | ||||
| + | ||||
| +#define PCIE20_PARF_CONFIG_BITS			0x50 | ||||
| +#define PHY_RX0_EQ(x)				(x << 24) | ||||
|  | ||||
|   | ||||
|  #define PCIE20_v3_PARF_SLV_ADDR_SPACE_SIZE	0x358 | ||||
|  #define SLV_ADDR_SPACE_SZ			0x10000000 | ||||
| @@ -102,6 +120,7 @@ | ||||
| @@ -102,6 +120,7 @@ struct qcom_pcie_resources_2_1_0 { | ||||
|  	struct regulator *vdda; | ||||
|  	struct regulator *vdda_phy; | ||||
|  	struct regulator *vdda_refclk; | ||||
| +	uint8_t phy_tx0_term_offset; | ||||
|  }; | ||||
|  | ||||
|   | ||||
|  struct qcom_pcie_resources_1_0_0 { | ||||
| @@ -179,6 +198,16 @@ | ||||
|  | ||||
| @@ -179,6 +198,16 @@ struct qcom_pcie { | ||||
|   | ||||
|  #define to_qcom_pcie(x)		dev_get_drvdata((x)->dev) | ||||
|  | ||||
|   | ||||
| +static inline void | ||||
| +writel_masked(void __iomem *addr, u32 clear_mask, u32 set_mask) | ||||
| +{ | ||||
| @@ -69,10 +69,10 @@ Signed-off-by: Sham Muthayyan <smuthayy@codeaurora.org> | ||||
|  static void qcom_ep_reset_assert(struct qcom_pcie *pcie) | ||||
|  { | ||||
|  	gpiod_set_value_cansleep(pcie->reset, 1); | ||||
| @@ -280,6 +309,10 @@ | ||||
| @@ -280,6 +309,10 @@ static int qcom_pcie_get_resources_2_1_0 | ||||
|  	if (IS_ERR(res->ext_reset)) | ||||
|  		return PTR_ERR(res->ext_reset); | ||||
|  | ||||
|   | ||||
| +	if (of_property_read_u8(dev->of_node, "phy-tx0-term-offset", | ||||
| +				&res->phy_tx0_term_offset)) | ||||
| +		res->phy_tx0_term_offset = 0; | ||||
| @@ -80,18 +80,18 @@ Signed-off-by: Sham Muthayyan <smuthayy@codeaurora.org> | ||||
|  	res->phy_reset = devm_reset_control_get_exclusive(dev, "phy"); | ||||
|  	return PTR_ERR_OR_ZERO(res->phy_reset); | ||||
|  } | ||||
| @@ -309,7 +342,6 @@ | ||||
| @@ -309,7 +342,6 @@ static int qcom_pcie_init_2_1_0(struct q | ||||
|  	struct qcom_pcie_resources_2_1_0 *res = &pcie->res.v2_1_0; | ||||
|  	struct dw_pcie *pci = pcie->pci; | ||||
|  	struct device *dev = pci->dev; | ||||
| -	u32 val; | ||||
|  	int ret; | ||||
|  | ||||
|   | ||||
|  	ret = reset_control_assert(res->ahb_reset); | ||||
| @@ -378,15 +410,26 @@ | ||||
| @@ -378,15 +410,26 @@ static int qcom_pcie_init_2_1_0(struct q | ||||
|  		goto err_deassert_ahb; | ||||
|  	} | ||||
|  | ||||
|   | ||||
| -	/* enable PCIe clocks and resets */ | ||||
| -	val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL); | ||||
| -	val &= ~BIT(0); | ||||
| @@ -121,6 +121,6 @@ Signed-off-by: Sham Muthayyan <smuthayy@codeaurora.org> | ||||
| +	/* Enable reference clock */ | ||||
| +	writel_masked(pcie->parf + PCIE20_PARF_PHY_REFCLK, | ||||
| +		      REF_USE_PAD, REF_SSP_EN); | ||||
|  | ||||
|   | ||||
|  	ret = reset_control_deassert(res->phy_reset); | ||||
|  	if (ret) { | ||||
|   | ||||
| @@ -16,7 +16,7 @@ Signed-off-by: Sham Muthayyan <smuthayy@codeaurora.org> | ||||
| @@ -83,6 +83,30 @@ | ||||
|  #define PCIE20_CAP_LINK_1			(PCIE20_CAP + 0x14) | ||||
|  #define PCIE_CAP_LINK1_VAL			0x2FD7F | ||||
|  | ||||
|   | ||||
| +#define PCIE20_CAP_LINKCTRLSTATUS		(PCIE20_CAP + 0x10) | ||||
| + | ||||
| +#define PCIE20_AXI_MSTR_RESP_COMP_CTRL0		0x818 | ||||
| @@ -42,12 +42,12 @@ Signed-off-by: Sham Muthayyan <smuthayy@codeaurora.org> | ||||
| +#define MSM_PCIE_DEV_CFG_ADDR			0x01000000 | ||||
| + | ||||
|  #define PCIE20_PARF_Q2A_FLUSH			0x1AC | ||||
|  | ||||
|   | ||||
|  #define PCIE20_MISC_CONTROL_1_REG		0x8BC | ||||
| @@ -251,6 +275,57 @@ | ||||
| 	writel(val, pcie->elbi + PCIE20_ELBI_SYS_CTRL); | ||||
| @@ -251,6 +275,57 @@ static void qcom_pcie_2_1_0_ltssm_enable | ||||
|  	writel(val, pcie->elbi + PCIE20_ELBI_SYS_CTRL); | ||||
|  } | ||||
|  | ||||
|   | ||||
| +static void qcom_pcie_prog_viewport_cfg0(struct qcom_pcie *pcie, u32 busdev) | ||||
| +{ | ||||
| +	struct pcie_port *pp = &pcie->pci->pp; | ||||
| @@ -101,14 +101,14 @@ Signed-off-by: Sham Muthayyan <smuthayy@codeaurora.org> | ||||
| + | ||||
|  static int qcom_pcie_get_resources_2_1_0(struct qcom_pcie *pcie) | ||||
|  { | ||||
| 	struct qcom_pcie_resources_2_1_0 *res = &pcie->res.v2_1_0; | ||||
| @@ -465,6 +538,9 @@ | ||||
| 	writel(CFG_BRIDGE_SB_INIT, | ||||
| 	       pci->dbi_base + PCIE20_AXI_MSTR_RESP_COMP_CTRL1); | ||||
|  | ||||
|  	struct qcom_pcie_resources_2_1_0 *res = &pcie->res.v2_1_0; | ||||
| @@ -465,6 +540,9 @@ static int qcom_pcie_init_2_1_0(struct q | ||||
|  	writel(CFG_BRIDGE_SB_INIT, | ||||
|  	       pci->dbi_base + PCIE20_AXI_MSTR_RESP_COMP_CTRL1); | ||||
|   | ||||
| +	qcom_pcie_prog_viewport_cfg0(pcie, MSM_PCIE_DEV_CFG_ADDR); | ||||
| +	qcom_pcie_prog_viewport_mem2_outbound(pcie); | ||||
| + | ||||
| 	return 0; | ||||
|  | ||||
|  	return 0; | ||||
|   | ||||
|  err_deassert_ahb: | ||||
|   | ||||
| @@ -14,48 +14,48 @@ Signed-off-by: Sham Muthayyan <smuthayy@codeaurora.org> | ||||
| @@ -129,6 +129,8 @@ | ||||
|  #define PCIE20_v3_PARF_SLV_ADDR_SPACE_SIZE	0x358 | ||||
|  #define SLV_ADDR_SPACE_SZ			0x10000000 | ||||
|  | ||||
|   | ||||
| +#define PCIE20_LNK_CONTROL2_LINK_STATUS2        0xA0 | ||||
| + | ||||
|  struct qcom_pcie_resources_2_1_0 { | ||||
| 	struct clk *iface_clk; | ||||
| 	struct clk *core_clk; | ||||
| @@ -218,6 +220,7 @@ | ||||
| 	struct phy *phy; | ||||
| 	struct gpio_desc *reset; | ||||
| 	struct qcom_pcie_ops *ops; | ||||
|  	struct clk *iface_clk; | ||||
|  	struct clk *core_clk; | ||||
| @@ -218,6 +220,7 @@ struct qcom_pcie { | ||||
|  	struct phy *phy; | ||||
|  	struct gpio_desc *reset; | ||||
|  	struct qcom_pcie_ops *ops; | ||||
| +	uint32_t force_gen1; | ||||
|  }; | ||||
|  | ||||
|   | ||||
|  #define to_qcom_pcie(x)		dev_get_drvdata((x)->dev) | ||||
| @@ -532,6 +535,11 @@ | ||||
|  | ||||
| 	/* wait for clock acquisition */ | ||||
| 	usleep_range(1000, 1500); | ||||
| @@ -532,6 +535,11 @@ static int qcom_pcie_init_2_1_0(struct q | ||||
|   | ||||
|  	/* wait for clock acquisition */ | ||||
|  	usleep_range(1000, 1500); | ||||
| +	if (pcie->force_gen1) { | ||||
| +		writel_relaxed((readl_relaxed( | ||||
| +			pcie->pci->dbi_base + PCIE20_LNK_CONTROL2_LINK_STATUS2) | 1), | ||||
| +			pcie->pci->dbi_base + PCIE20_LNK_CONTROL2_LINK_STATUS2); | ||||
| +	} | ||||
|  | ||||
|  | ||||
| 	/* Set the Max TLP size to 2K, instead of using default of 4K */ | ||||
| @@ -1382,6 +1390,8 @@ | ||||
| 	struct dw_pcie *pci; | ||||
| 	struct qcom_pcie *pcie; | ||||
| 	int ret; | ||||
|   | ||||
|   | ||||
|  	/* Set the Max TLP size to 2K, instead of using default of 4K */ | ||||
| @@ -1382,6 +1390,8 @@ static int qcom_pcie_probe(struct platfo | ||||
|  	struct dw_pcie *pci; | ||||
|  	struct qcom_pcie *pcie; | ||||
|  	int ret; | ||||
| +	uint32_t force_gen1 = 0; | ||||
| +	struct device_node *np = pdev->dev.of_node; | ||||
|  | ||||
| 	pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL); | ||||
| 	if (!pcie) | ||||
| @@ -1403,6 +1413,9 @@ | ||||
| 	if (IS_ERR(pcie->reset)) | ||||
| 		return PTR_ERR(pcie->reset); | ||||
|  | ||||
|   | ||||
|  	pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL); | ||||
|  	if (!pcie) | ||||
| @@ -1403,6 +1413,9 @@ static int qcom_pcie_probe(struct platfo | ||||
|  	if (IS_ERR(pcie->reset)) | ||||
|  		return PTR_ERR(pcie->reset); | ||||
|   | ||||
| +	of_property_read_u32(np, "force_gen1", &force_gen1); | ||||
| +	pcie->force_gen1 = force_gen1; | ||||
| + | ||||
| 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "parf"); | ||||
| 	pcie->parf = devm_ioremap_resource(dev, res); | ||||
| 	if (IS_ERR(pcie->parf)) | ||||
|  	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "parf"); | ||||
|  	pcie->parf = devm_ioremap_resource(dev, res); | ||||
|  	if (IS_ERR(pcie->parf)) | ||||
|   | ||||
| @@ -17,9 +17,9 @@ Signed-off-by: Gokul Sriram Palanisamy <gpalan@codeaurora.org> | ||||
| --- a/drivers/pci/dwc/pcie-qcom.c | ||||
| +++ b/drivers/pci/dwc/pcie-qcom.c | ||||
| @@ -131,6 +131,14 @@ | ||||
|  | ||||
|   | ||||
|  #define PCIE20_LNK_CONTROL2_LINK_STATUS2        0xA0 | ||||
|  | ||||
|   | ||||
| +#define __set(v, a, b)	(((v) << (b)) & GENMASK(a, b)) | ||||
| +#define __mask(a, b)	(((1 << ((a) + 1)) - 1) & ~((1 << (b)) - 1)) | ||||
| +#define PCIE20_DEV_CAS			0x78 | ||||
| @@ -29,12 +29,12 @@ Signed-off-by: Gokul Sriram Palanisamy <gpalan@codeaurora.org> | ||||
| +#define PCIE20_MPS(x)			__set(x, 7, 5) | ||||
| + | ||||
|  struct qcom_pcie_resources_2_1_0 { | ||||
| 	struct clk *iface_clk; | ||||
| 	struct clk *core_clk; | ||||
| @@ -1472,6 +1480,35 @@ | ||||
| 	return 0; | ||||
|  	struct clk *iface_clk; | ||||
|  	struct clk *core_clk; | ||||
| @@ -1472,6 +1480,35 @@ static int qcom_pcie_probe(struct platfo | ||||
|  	return 0; | ||||
|  } | ||||
|  | ||||
|   | ||||
| +static void qcom_pcie_fixup_final(struct pci_dev *dev) | ||||
| +{ | ||||
| +	int cap, err; | ||||
| @@ -65,5 +65,5 @@ Signed-off-by: Gokul Sriram Palanisamy <gpalan@codeaurora.org> | ||||
| +DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, qcom_pcie_fixup_final); | ||||
| + | ||||
|  static const struct of_device_id qcom_pcie_match[] = { | ||||
| 	{ .compatible = "qcom,pcie-apq8084", .data = &ops_1_0_0 }, | ||||
| 	{ .compatible = "qcom,pcie-ipq8064", .data = &ops_2_1_0 }, | ||||
|  	{ .compatible = "qcom,pcie-apq8084", .data = &ops_1_0_0 }, | ||||
|  	{ .compatible = "qcom,pcie-ipq8064", .data = &ops_2_1_0 }, | ||||
|   | ||||
| @@ -38,54 +38,54 @@ Signed-off-by: Abhishek Sahu <absahu@codeaurora.org> | ||||
|  | ||||
| --- a/drivers/pci/dwc/pcie-qcom.c | ||||
| +++ b/drivers/pci/dwc/pcie-qcom.c | ||||
| @@ -407,6 +407,7 @@ | ||||
| @@ -407,6 +407,7 @@ static void qcom_pcie_deinit_2_1_0(struc | ||||
|  { | ||||
| 	struct qcom_pcie_resources_2_1_0 *res = &pcie->res.v2_1_0; | ||||
|  | ||||
|  	struct qcom_pcie_resources_2_1_0 *res = &pcie->res.v2_1_0; | ||||
|   | ||||
| +	clk_disable_unprepare(res->phy_clk); | ||||
| 	reset_control_assert(res->pci_reset); | ||||
| 	reset_control_assert(res->axi_reset); | ||||
| 	reset_control_assert(res->ahb_reset); | ||||
| @@ -415,7 +415,6 @@ | ||||
| 	reset_control_assert(res->ext_reset); | ||||
| 	clk_disable_unprepare(res->iface_clk); | ||||
| 	clk_disable_unprepare(res->core_clk); | ||||
|  	reset_control_assert(res->pci_reset); | ||||
|  	reset_control_assert(res->axi_reset); | ||||
|  	reset_control_assert(res->ahb_reset); | ||||
| @@ -415,7 +416,6 @@ static void qcom_pcie_deinit_2_1_0(struc | ||||
|  	reset_control_assert(res->ext_reset); | ||||
|  	clk_disable_unprepare(res->iface_clk); | ||||
|  	clk_disable_unprepare(res->core_clk); | ||||
| -	clk_disable_unprepare(res->phy_clk); | ||||
| 	clk_disable_unprepare(res->aux_clk); | ||||
| 	clk_disable_unprepare(res->ref_clk); | ||||
| 	regulator_disable(res->vdda); | ||||
| @@ -472,12 +472,6 @@ | ||||
| 		goto err_clk_core; | ||||
| 	} | ||||
|  | ||||
|  	clk_disable_unprepare(res->aux_clk); | ||||
|  	clk_disable_unprepare(res->ref_clk); | ||||
|  	regulator_disable(res->vdda); | ||||
| @@ -472,12 +472,6 @@ static int qcom_pcie_init_2_1_0(struct q | ||||
|  		goto err_clk_core; | ||||
|  	} | ||||
|   | ||||
| -	ret = clk_prepare_enable(res->phy_clk); | ||||
| -	if (ret) { | ||||
| -		dev_err(dev, "cannot prepare/enable phy clock\n"); | ||||
| -		goto err_clk_phy; | ||||
| -	} | ||||
| - | ||||
| 	ret = clk_prepare_enable(res->aux_clk); | ||||
| 	if (ret) { | ||||
| 		dev_err(dev, "cannot prepare/enable aux clock\n"); | ||||
| @@ -541,6 +535,12 @@ | ||||
| 		return ret; | ||||
| 	} | ||||
|  | ||||
|  	ret = clk_prepare_enable(res->aux_clk); | ||||
|  	if (ret) { | ||||
|  		dev_err(dev, "cannot prepare/enable aux clock\n"); | ||||
| @@ -541,6 +535,12 @@ static int qcom_pcie_init_2_1_0(struct q | ||||
|  		return ret; | ||||
|  	} | ||||
|   | ||||
| +	ret = clk_prepare_enable(res->phy_clk); | ||||
| +	if (ret) { | ||||
| +		dev_err(dev, "cannot prepare/enable phy clock\n"); | ||||
| +		goto err_deassert_ahb; | ||||
| +	} | ||||
| + | ||||
| 	/* wait for clock acquisition */ | ||||
| 	usleep_range(1000, 1500); | ||||
| 	if (pcie->force_gen1) { | ||||
| @@ -566,8 +566,6 @@ | ||||
|  	/* wait for clock acquisition */ | ||||
|  	usleep_range(1000, 1500); | ||||
|  	if (pcie->force_gen1) { | ||||
| @@ -566,8 +566,6 @@ err_deassert_ahb: | ||||
|  err_clk_ref: | ||||
| 	clk_disable_unprepare(res->aux_clk); | ||||
|  	clk_disable_unprepare(res->aux_clk); | ||||
|  err_clk_aux: | ||||
| -	clk_disable_unprepare(res->phy_clk); | ||||
| -err_clk_phy: | ||||
| 	clk_disable_unprepare(res->core_clk); | ||||
|  	clk_disable_unprepare(res->core_clk); | ||||
|  err_clk_core: | ||||
| 	clk_disable_unprepare(res->iface_clk); | ||||
|  	clk_disable_unprepare(res->iface_clk); | ||||
|   | ||||
| @@ -14,12 +14,12 @@ Signed-off-by: Abhishek Sahu <absahu@codeaurora.org> | ||||
|  | ||||
| --- a/drivers/pci/dwc/pcie-qcom.c | ||||
| +++ b/drivers/pci/dwc/pcie-qcom.c | ||||
| @@ -408,7 +408,7 @@ | ||||
| 	struct qcom_pcie_resources_2_1_0 *res = &pcie->res.v2_1_0; | ||||
|  | ||||
| 	clk_disable_unprepare(res->phy_clk); | ||||
| @@ -408,7 +408,7 @@ static void qcom_pcie_deinit_2_1_0(struc | ||||
|  	struct qcom_pcie_resources_2_1_0 *res = &pcie->res.v2_1_0; | ||||
|   | ||||
|  	clk_disable_unprepare(res->phy_clk); | ||||
| -	reset_control_assert(res->pci_reset); | ||||
| +	reset_control_assert(res->phy_reset); | ||||
| 	reset_control_assert(res->axi_reset); | ||||
| 	reset_control_assert(res->ahb_reset); | ||||
| 	reset_control_assert(res->por_reset); | ||||
|  	reset_control_assert(res->axi_reset); | ||||
|  	reset_control_assert(res->ahb_reset); | ||||
|  	reset_control_assert(res->por_reset); | ||||
|   | ||||
| @@ -1,12 +1,12 @@ | ||||
| --- a/drivers/firmware/qcom_scm.c | ||||
| +++ b/drivers/firmware/qcom_scm.c | ||||
| @@ -422,6 +422,9 @@ | ||||
| 	{ .compatible = "qcom,scm-msm8996", | ||||
| 	  .data = NULL, /* no clocks */ | ||||
| 	}, | ||||
| @@ -422,6 +422,9 @@ static const struct of_device_id qcom_sc | ||||
|  	{ .compatible = "qcom,scm-msm8996", | ||||
|  	  .data = NULL, /* no clocks */ | ||||
|  	}, | ||||
| +	{ .compatible = "qcom,scm-ipq806x", | ||||
| +	  .data = NULL, /* no clocks */ | ||||
| +	}, | ||||
| 	{ .compatible = "qcom,scm", | ||||
| 	  .data = (void *)(SCM_HAS_CORE_CLK | ||||
| 			   | SCM_HAS_IFACE_CLK | ||||
|  	{ .compatible = "qcom,scm", | ||||
|  	  .data = (void *)(SCM_HAS_CORE_CLK | ||||
|  			   | SCM_HAS_IFACE_CLK | ||||
|   | ||||
| @@ -21,10 +21,10 @@ Signed-off-by: Ajay Kishore <akisho@codeaurora.org> | ||||
|  | ||||
| --- a/drivers/firmware/qcom_scm-32.c | ||||
| +++ b/drivers/firmware/qcom_scm-32.c | ||||
| @@ -561,6 +561,24 @@ | ||||
| 	return ret ? : le32_to_cpu(out); | ||||
| @@ -561,6 +561,24 @@ int __qcom_scm_pas_mss_reset(struct devi | ||||
|  	return ret ? : le32_to_cpu(out); | ||||
|  } | ||||
|  | ||||
|   | ||||
| +int __qcom_scm_pinmux_read(u32 svc_id, u32 cmd_id, u32 arg1) | ||||
| +{ | ||||
| +	s32 ret; | ||||
| @@ -45,13 +45,13 @@ Signed-off-by: Ajay Kishore <akisho@codeaurora.org> | ||||
| + | ||||
|  int __qcom_scm_set_remote_state(struct device *dev, u32 state, u32 id) | ||||
|  { | ||||
| 	struct { | ||||
|  	struct { | ||||
| --- a/drivers/firmware/qcom_scm-64.c | ||||
| +++ b/drivers/firmware/qcom_scm-64.c | ||||
| @@ -366,6 +366,16 @@ | ||||
| 	return ret ? : res.a1; | ||||
| @@ -366,6 +366,16 @@ int __qcom_scm_pas_mss_reset(struct devi | ||||
|  	return ret ? : res.a1; | ||||
|  } | ||||
|  | ||||
|   | ||||
| +int __qcom_scm_pinmux_read(u32 svc_id, u32 cmd_id, u32 arg1) | ||||
| +{ | ||||
| +	return -ENOTSUPP; | ||||
| @@ -64,11 +64,11 @@ Signed-off-by: Ajay Kishore <akisho@codeaurora.org> | ||||
| + | ||||
|  int __qcom_scm_set_remote_state(struct device *dev, u32 state, u32 id) | ||||
|  { | ||||
| 	struct qcom_scm_desc desc = {0}; | ||||
|  	struct qcom_scm_desc desc = {0}; | ||||
| --- a/drivers/firmware/qcom_scm.c | ||||
| +++ b/drivers/firmware/qcom_scm.c | ||||
| @@ -470,3 +470,16 @@ static int __init qcom_scm_init(void) | ||||
| 	return platform_driver_register(&qcom_scm_driver); | ||||
|  	return platform_driver_register(&qcom_scm_driver); | ||||
|  } | ||||
|  subsys_initcall(qcom_scm_init); | ||||
| + | ||||
| @@ -89,7 +89,7 @@ Signed-off-by: Ajay Kishore <akisho@codeaurora.org> | ||||
| @@ -58,6 +58,13 @@ extern int  __qcom_scm_pas_auth_and_rese | ||||
|  extern int  __qcom_scm_pas_shutdown(struct device *dev, u32 peripheral); | ||||
|  extern int  __qcom_scm_pas_mss_reset(struct device *dev, bool reset); | ||||
|  | ||||
|   | ||||
| +#define SCM_IO_READ	1 | ||||
| +#define SCM_IO_WRITE	2 | ||||
| +#define SCM_SVC_IO_ACCESS	0x5 | ||||
| @@ -112,23 +112,23 @@ Signed-off-by: Ajay Kishore <akisho@codeaurora.org> | ||||
|  #include "../core.h" | ||||
|  #include "../pinconf.h" | ||||
|  #include "pinctrl-msm.h" | ||||
| @@ -638,6 +639,9 @@ static int msm_gpio_irq_set_type(struct | ||||
| 	const struct msm_pingroup *g; | ||||
| 	unsigned long flags; | ||||
| 	u32 val; | ||||
| @@ -638,6 +639,9 @@ static void msm_gpio_irq_ack(struct irq_ | ||||
|  	const struct msm_pingroup *g; | ||||
|  	unsigned long flags; | ||||
|  	u32 val; | ||||
| +	u32 addr; | ||||
| +	int ret; | ||||
| +	const __be32 *reg; | ||||
|  | ||||
| 	g = &pctrl->soc->groups[d->hwirq]; | ||||
|  | ||||
|   | ||||
|  	g = &pctrl->soc->groups[d->hwirq]; | ||||
|   | ||||
| @@ -676,11 +680,30 @@ static int msm_gpio_irq_set_type(struct | ||||
| 	else | ||||
| 		clear_bit(d->hwirq, pctrl->dual_edge_irqs); | ||||
|  | ||||
|  	else | ||||
|  		clear_bit(d->hwirq, pctrl->dual_edge_irqs); | ||||
|   | ||||
| +	int ret = of_device_is_compatible(pctrl->dev->of_node, | ||||
| +					"qcom,ipq8064-pinctrl"); | ||||
| 	/* Route interrupts to application cpu */ | ||||
|  	/* Route interrupts to application cpu */ | ||||
| -	val = readl(pctrl->regs + g->intr_target_reg); | ||||
| -	val &= ~(7 << g->intr_target_bit); | ||||
| -	val |= g->intr_target_kpss_val << g->intr_target_bit; | ||||
| @@ -154,17 +154,17 @@ Signed-off-by: Ajay Kishore <akisho@codeaurora.org> | ||||
| +				pr_err("\n Routing interrupts to Apps proc failed"); | ||||
| +		} | ||||
| +	} | ||||
|  | ||||
| 	/* Update configuration for gpio. | ||||
| 	 * RAW_STATUS_EN is left on for all gpio irqs. Due to the | ||||
|   | ||||
|  	/* Update configuration for gpio. | ||||
|  	 * RAW_STATUS_EN is left on for all gpio irqs. Due to the | ||||
| @@ -954,4 +977,3 @@ int msm_pinctrl_remove(struct platform_d | ||||
| 	return 0; | ||||
|  	return 0; | ||||
|  } | ||||
|  EXPORT_SYMBOL(msm_pinctrl_remove); | ||||
| - | ||||
| --- a/include/linux/qcom_scm.h | ||||
| +++ b/include/linux/qcom_scm.h | ||||
| @@ -43,6 +43,8 @@ | ||||
| @@ -43,6 +43,8 @@ extern int qcom_scm_set_remote_state(u32 | ||||
|  extern int qcom_scm_restore_sec_cfg(u32 device_id, u32 spare); | ||||
|  extern int qcom_scm_iommu_secure_ptbl_size(u32 spare, size_t *size); | ||||
|  extern int qcom_scm_iommu_secure_ptbl_init(u64 addr, u32 size, u32 spare); | ||||
| @@ -173,7 +173,7 @@ Signed-off-by: Ajay Kishore <akisho@codeaurora.org> | ||||
|  #else | ||||
|  static inline | ||||
|  int qcom_scm_set_cold_boot_addr(void *entry, const cpumask_t *cpus) | ||||
| @@ -73,5 +75,7 @@ | ||||
| @@ -73,5 +75,7 @@ qcom_scm_set_remote_state(u32 state,u32 | ||||
|  static inline int qcom_scm_restore_sec_cfg(u32 device_id, u32 spare) { return -ENODEV; } | ||||
|  static inline int qcom_scm_iommu_secure_ptbl_size(u32 spare, size_t *size) { return -ENODEV; } | ||||
|  static inline int qcom_scm_iommu_secure_ptbl_init(u64 addr, u32 size, u32 spare) { return -ENODEV; } | ||||
|   | ||||
| @@ -26,19 +26,19 @@ Signed-off-by: Vasudevan Murugesan <vmuruges@codeaurora.org> | ||||
|  #include <linux/of.h> | ||||
|  #include <linux/of_platform.h> | ||||
|  #include <linux/pm_runtime.h> | ||||
| @@ -33,6 +34,8 @@ | ||||
| 	struct device		*dev; | ||||
| 	struct clk		**clks; | ||||
| 	int			num_clocks; | ||||
| @@ -33,6 +34,8 @@ struct dwc3_of_simple { | ||||
|  	struct device		*dev; | ||||
|  	struct clk		**clks; | ||||
|  	int			num_clocks; | ||||
| +	struct reset_control	*mstr_rst_30_0; | ||||
| +	struct reset_control	*mstr_rst_30_1; | ||||
|  }; | ||||
|  | ||||
|   | ||||
|  static int dwc3_of_simple_clk_init(struct dwc3_of_simple *simple, int count) | ||||
| @@ -102,6 +105,20 @@ | ||||
| 	if (ret) | ||||
| 		return ret; | ||||
|  | ||||
| @@ -102,6 +105,20 @@ static int dwc3_of_simple_probe(struct p | ||||
|  	if (ret) | ||||
|  		return ret; | ||||
|   | ||||
| +	simple->mstr_rst_30_0 = devm_reset_control_get(dev, "usb30_0_mstr_rst"); | ||||
| + | ||||
| +	if (!IS_ERR(simple->mstr_rst_30_0)) | ||||
| @@ -53,19 +53,19 @@ Signed-off-by: Vasudevan Murugesan <vmuruges@codeaurora.org> | ||||
| +	else | ||||
| +		dev_dbg(simple->dev, "cannot get handle for USB PHY 1 master reset control\n"); | ||||
| + | ||||
| 	ret = of_platform_populate(np, NULL, NULL, dev); | ||||
| 	if (ret) { | ||||
| 		for (i = 0; i < simple->num_clocks; i++) { | ||||
| @@ -130,6 +147,12 @@ | ||||
| 		clk_put(simple->clks[i]); | ||||
| 	} | ||||
|  | ||||
|  	ret = of_platform_populate(np, NULL, NULL, dev); | ||||
|  	if (ret) { | ||||
|  		for (i = 0; i < simple->num_clocks; i++) { | ||||
| @@ -130,6 +147,12 @@ static int dwc3_of_simple_remove(struct | ||||
|  		clk_put(simple->clks[i]); | ||||
|  	} | ||||
|   | ||||
| +	if (!IS_ERR(simple->mstr_rst_30_0)) | ||||
| +		reset_control_assert(simple->mstr_rst_30_0); | ||||
| + | ||||
| +	if (!IS_ERR(simple->mstr_rst_30_1)) | ||||
| +		reset_control_assert(simple->mstr_rst_30_1); | ||||
| + | ||||
| 	of_platform_depopulate(dev); | ||||
|  | ||||
| 	pm_runtime_put_sync(dev); | ||||
|  	of_platform_depopulate(dev); | ||||
|   | ||||
|  	pm_runtime_put_sync(dev); | ||||
|   | ||||
| @@ -11,12 +11,12 @@ the ubi volume created by the other. | ||||
| --- | ||||
| --- a/drivers/mtd/spi-nor/spi-nor.c | ||||
| +++ b/drivers/mtd/spi-nor/spi-nor.c | ||||
| @@ -1023,7 +1023,7 @@ | ||||
| 	{ "mx25u6435f",  INFO(0xc22537, 0, 64 * 1024, 128, SECT_4K) }, | ||||
| 	{ "mx25l12805d", INFO(0xc22018, 0, 64 * 1024, 256, 0) }, | ||||
| 	{ "mx25l12855e", INFO(0xc22618, 0, 64 * 1024, 256, 0) }, | ||||
| @@ -1023,7 +1023,7 @@ static const struct flash_info spi_nor_i | ||||
|  	{ "mx25u6435f",  INFO(0xc22537, 0, 64 * 1024, 128, SECT_4K) }, | ||||
|  	{ "mx25l12805d", INFO(0xc22018, 0, 64 * 1024, 256, 0) }, | ||||
|  	{ "mx25l12855e", INFO(0xc22618, 0, 64 * 1024, 256, 0) }, | ||||
| -	{ "mx25l25635e", INFO(0xc22019, 0, 64 * 1024, 512, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, | ||||
| +	{ "mx25l25635f", INFO(0xc22019, 0, 64 * 1024, 512, SECT_4K) }, | ||||
| 	{ "mx25u25635f", INFO(0xc22539, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_4B_OPCODES) }, | ||||
| 	{ "mx25l25655e", INFO(0xc22619, 0, 64 * 1024, 512, 0) }, | ||||
| 	{ "mx66l51235l", INFO(0xc2201a, 0, 64 * 1024, 1024, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, | ||||
|  	{ "mx25u25635f", INFO(0xc22539, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_4B_OPCODES) }, | ||||
|  	{ "mx25l25655e", INFO(0xc22619, 0, 64 * 1024, 512, 0) }, | ||||
|  	{ "mx66l51235l", INFO(0xc2201a, 0, 64 * 1024, 1024, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, | ||||
|   | ||||
| @@ -7,20 +7,20 @@ Subject: BUS: add MSM_BUS | ||||
|  obj-$(CONFIG_MIPS_CDMM)		+= mips_cdmm.o | ||||
|  obj-$(CONFIG_MVEBU_MBUS) 	+= mvebu-mbus.o | ||||
| +obj-$(CONFIG_BUS_TOPOLOGY_ADHOC)+= msm_bus/ | ||||
|  | ||||
|   | ||||
|  # Interconnect bus driver for OMAP SoCs. | ||||
|  obj-$(CONFIG_OMAP_INTERCONNECT)	+= omap_l3_smx.o omap_l3_noc.o | ||||
| --- a/drivers/bus/Kconfig | ||||
| +++ b/drivers/bus/Kconfig | ||||
| @@ -93,6 +93,8 @@ config MVEBU_MBUS | ||||
| 	  Driver needed for the MBus configuration on Marvell EBU SoCs | ||||
| 	  (Kirkwood, Dove, Orion5x, MV78XX0 and Armada 370/XP). | ||||
|  | ||||
|  	  Driver needed for the MBus configuration on Marvell EBU SoCs | ||||
|  	  (Kirkwood, Dove, Orion5x, MV78XX0 and Armada 370/XP). | ||||
|   | ||||
| +source "drivers/bus/msm_bus/Kconfig" | ||||
| + | ||||
|  config OMAP_INTERCONNECT | ||||
| 	tristate "OMAP INTERCONNECT DRIVER" | ||||
| 	depends on ARCH_OMAP2PLUS | ||||
|  	tristate "OMAP INTERCONNECT DRIVER" | ||||
|  	depends on ARCH_OMAP2PLUS | ||||
| --- /dev/null | ||||
| +++ b/include/dt-bindings/msm/msm-bus-ids.h | ||||
| @@ -0,0 +1,869 @@ | ||||
|   | ||||
| @@ -10,9 +10,9 @@ Subject: SoC: add qualcomm syscon | ||||
| --- a/drivers/soc/qcom/Kconfig | ||||
| +++ b/drivers/soc/qcom/Kconfig | ||||
| @@ -78,6 +78,13 @@ config QCOM_SMSM | ||||
| 	  Say yes here to support the Qualcomm Shared Memory State Machine. | ||||
| 	  The state machine is represented by bits in shared memory. | ||||
|  | ||||
|  	  Say yes here to support the Qualcomm Shared Memory State Machine. | ||||
|  	  The state machine is represented by bits in shared memory. | ||||
|   | ||||
| +config QCOM_TCSR | ||||
| +	tristate "QCOM Top Control and Status Registers" | ||||
| +	depends on ARCH_QCOM | ||||
| @@ -21,8 +21,8 @@ Subject: SoC: add qualcomm syscon | ||||
| +	  functions for various peripherals. | ||||
| + | ||||
|  config QCOM_WCNSS_CTRL | ||||
| 	tristate "Qualcomm WCNSS control driver" | ||||
| 	depends on ARCH_QCOM | ||||
|  	tristate "Qualcomm WCNSS control driver" | ||||
|  	depends on ARCH_QCOM | ||||
| --- /dev/null | ||||
| +++ b/drivers/soc/qcom/qcom_tcsr.c | ||||
| @@ -0,0 +1,98 @@ | ||||
|   | ||||
| @@ -18,7 +18,7 @@ Signed-off-by: Mathias Kresin <dev@kresin.me> | ||||
|  | ||||
| --- a/drivers/soc/lantiq/gphy.c | ||||
| +++ b/drivers/soc/lantiq/gphy.c | ||||
| @@ -56,6 +56,7 @@ static const struct xway_gphy_match_data | ||||
| @@ -55,6 +55,7 @@ static const struct xway_gphy_match_data | ||||
|  }; | ||||
|   | ||||
|  static const struct of_device_id xway_gphy_match[] = { | ||||
| @@ -26,7 +26,7 @@ Signed-off-by: Mathias Kresin <dev@kresin.me> | ||||
|  	{ .compatible = "lantiq,xrx200a1x-gphy", .data = &xrx200a1x_gphy_data }, | ||||
|  	{ .compatible = "lantiq,xrx200a2x-gphy", .data = &xrx200a2x_gphy_data }, | ||||
|  	{ .compatible = "lantiq,xrx300-gphy", .data = &xrx300_gphy_data }, | ||||
| @@ -130,6 +131,16 @@ static int xway_gphy_of_probe(struct pla | ||||
| @@ -111,6 +112,16 @@ static int xway_gphy_of_probe(struct pla | ||||
|   | ||||
|  	gphy_fw_name_cfg = of_device_get_match_data(dev); | ||||
|   | ||||
|   | ||||
| @@ -1,86 +0,0 @@ | ||||
| From ae14aba7fc748b2da282b59a2f516a311ed1f6eb Mon Sep 17 00:00:00 2001 | ||||
| From: Mathias Kresin <dev@kresin.me> | ||||
| Date: Tue, 27 Mar 2018 23:15:07 +0200 | ||||
| Subject: [PATCH] MIPS: lantiq: gphy: Remove reboot/remove reset asserts | ||||
|  | ||||
| While doing a global software reset, these bits are not cleared and let | ||||
| some bootloader fail to initialise the GPHYs. The bootloader don't expect | ||||
| these bits to be set, as they aren't during power on. | ||||
|  | ||||
| The asserts were a workaround for a wrong syscon-reboot mask. With a mask | ||||
| set which includes the GPHY resets of the first reset register, the | ||||
| resets of the second reset register arn't required any more. | ||||
|  | ||||
| Signed-off-by: Mathias Kresin <dev@kresin.me> | ||||
| --- | ||||
|  drivers/soc/lantiq/gphy.c | 34 ---------------------------------- | ||||
|  1 file changed, 34 deletions(-) | ||||
|  | ||||
| --- a/drivers/soc/lantiq/gphy.c | ||||
| +++ b/drivers/soc/lantiq/gphy.c | ||||
| @@ -30,7 +30,6 @@ struct xway_gphy_priv { | ||||
|  	struct clk *gphy_clk_gate; | ||||
|  	struct reset_control *gphy_reset; | ||||
|  	struct reset_control *gphy_reset2; | ||||
| -	struct notifier_block gphy_reboot_nb; | ||||
|  	void __iomem *membase; | ||||
|  	char *fw_name; | ||||
|  }; | ||||
| @@ -65,24 +64,6 @@ static const struct of_device_id xway_gp | ||||
|  }; | ||||
|  MODULE_DEVICE_TABLE(of, xway_gphy_match); | ||||
|   | ||||
| -static struct xway_gphy_priv *to_xway_gphy_priv(struct notifier_block *nb) | ||||
| -{ | ||||
| -	return container_of(nb, struct xway_gphy_priv, gphy_reboot_nb); | ||||
| -} | ||||
| - | ||||
| -static int xway_gphy_reboot_notify(struct notifier_block *reboot_nb, | ||||
| -				   unsigned long code, void *unused) | ||||
| -{ | ||||
| -	struct xway_gphy_priv *priv = to_xway_gphy_priv(reboot_nb); | ||||
| - | ||||
| -	if (priv) { | ||||
| -		reset_control_assert(priv->gphy_reset); | ||||
| -		reset_control_assert(priv->gphy_reset2); | ||||
| -	} | ||||
| - | ||||
| -	return NOTIFY_DONE; | ||||
| -} | ||||
| - | ||||
|  static int xway_gphy_load(struct device *dev, struct xway_gphy_priv *priv, | ||||
|  			  dma_addr_t *dev_addr) | ||||
|  { | ||||
| @@ -216,14 +197,6 @@ static int xway_gphy_probe(struct platfo | ||||
|  	reset_control_deassert(priv->gphy_reset); | ||||
|  	reset_control_deassert(priv->gphy_reset2); | ||||
|   | ||||
| -	/* assert the gphy reset because it can hang after a reboot: */ | ||||
| -	priv->gphy_reboot_nb.notifier_call = xway_gphy_reboot_notify; | ||||
| -	priv->gphy_reboot_nb.priority = -1; | ||||
| - | ||||
| -	ret = register_reboot_notifier(&priv->gphy_reboot_nb); | ||||
| -	if (ret) | ||||
| -		dev_warn(dev, "Failed to register reboot notifier\n"); | ||||
| - | ||||
|  	platform_set_drvdata(pdev, priv); | ||||
|   | ||||
|  	return ret; | ||||
| @@ -235,17 +208,10 @@ static int xway_gphy_remove(struct platf | ||||
|  	struct xway_gphy_priv *priv = platform_get_drvdata(pdev); | ||||
|  	int ret; | ||||
|   | ||||
| -	reset_control_assert(priv->gphy_reset); | ||||
| -	reset_control_assert(priv->gphy_reset2); | ||||
| - | ||||
|  	iowrite32be(0, priv->membase); | ||||
|   | ||||
|  	clk_disable_unprepare(priv->gphy_clk_gate); | ||||
|   | ||||
| -	ret = unregister_reboot_notifier(&priv->gphy_reboot_nb); | ||||
| -	if (ret) | ||||
| -		dev_warn(dev, "Failed to unregister reboot notifier\n"); | ||||
| - | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| @@ -57,9 +57,9 @@ Signed-off-by: John Crispin <john@phrozen.org> | ||||
|  } | ||||
|   | ||||
|  static const struct of_device_id mt7530_of_match[] = { | ||||
| @@ -1135,16 +1142,16 @@ static const struct of_device_id mt7530_ | ||||
|  	{ /* sentinel */ }, | ||||
| @@ -1136,16 +1143,16 @@ static const struct of_device_id mt7530_ | ||||
|  }; | ||||
|  MODULE_DEVICE_TABLE(of, mt7530_of_match); | ||||
|   | ||||
| -static struct mdio_driver mt7530_mdio_driver = { | ||||
| +static struct platform_driver mtk_mt7530_driver = { | ||||
|   | ||||
| @@ -28,7 +28,7 @@ Signed-off-by: Michael Gray <michael.gray@lantisproject.com> | ||||
|  | ||||
| --- a/arch/arm/Kconfig | ||||
| +++ b/arch/arm/Kconfig | ||||
| @@ -1948,6 +1948,17 @@ config ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEN | ||||
| @@ -1938,6 +1938,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. | ||||
|   | ||||
| @@ -48,7 +48,7 @@ Signed-off-by: Michael Gray <michael.gray@lantisproject.com> | ||||
|  config CMDLINE | ||||
| --- a/arch/arm/boot/compressed/atags_to_fdt.c | ||||
| +++ b/arch/arm/boot/compressed/atags_to_fdt.c | ||||
| @@ -3,6 +3,8 @@ | ||||
| @@ -4,6 +4,8 @@ | ||||
|   | ||||
|  #if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND) | ||||
|  #define do_extend_cmdline 1 | ||||
| @@ -57,7 +57,7 @@ Signed-off-by: Michael Gray <michael.gray@lantisproject.com> | ||||
|  #else | ||||
|  #define do_extend_cmdline 0 | ||||
|  #endif | ||||
| @@ -66,6 +68,65 @@ static uint32_t get_cell_size(const void | ||||
| @@ -67,6 +69,65 @@ static uint32_t get_cell_size(const void | ||||
|  	return cell_size; | ||||
|  } | ||||
|   | ||||
| @@ -123,7 +123,7 @@ Signed-off-by: Michael Gray <michael.gray@lantisproject.com> | ||||
|  static void merge_fdt_bootargs(void *fdt, const char *fdt_cmdline) | ||||
|  { | ||||
|  	char cmdline[COMMAND_LINE_SIZE]; | ||||
| @@ -85,12 +140,21 @@ static void merge_fdt_bootargs(void *fdt | ||||
| @@ -86,12 +147,21 @@ static void merge_fdt_bootargs(void *fdt | ||||
|   | ||||
|  	/* and append the ATAG_CMDLINE */ | ||||
|  	if (fdt_cmdline) { | ||||
| @@ -145,7 +145,7 @@ Signed-off-by: Michael Gray <michael.gray@lantisproject.com> | ||||
|  	} | ||||
|  	*ptr = '\0'; | ||||
|   | ||||
| @@ -147,7 +211,9 @@ int atags_to_fdt(void *atag_list, void * | ||||
| @@ -148,7 +218,9 @@ int atags_to_fdt(void *atag_list, void * | ||||
|  			else | ||||
|  				setprop_string(fdt, "/chosen", "bootargs", | ||||
|  					       atag->u.cmdline.cmdline); | ||||
| @@ -156,7 +156,7 @@ Signed-off-by: Michael Gray <michael.gray@lantisproject.com> | ||||
|  			if (memcount >= sizeof(mem_reg_property)/4) | ||||
|  				continue; | ||||
|  			if (!atag->u.mem.size) | ||||
| @@ -186,6 +252,10 @@ int atags_to_fdt(void *atag_list, void * | ||||
| @@ -187,6 +259,10 @@ int atags_to_fdt(void *atag_list, void * | ||||
|  		setprop(fdt, "/memory", "reg", mem_reg_property, | ||||
|  			4 * memcount * memsize); | ||||
|  	} | ||||
| @@ -169,7 +169,7 @@ Signed-off-by: Michael Gray <michael.gray@lantisproject.com> | ||||
|  } | ||||
| --- a/init/main.c | ||||
| +++ b/init/main.c | ||||
| @@ -89,6 +89,10 @@ | ||||
| @@ -95,6 +95,10 @@ | ||||
|  #include <asm/sections.h> | ||||
|  #include <asm/cacheflush.h> | ||||
|   | ||||
| @@ -180,7 +180,7 @@ Signed-off-by: Michael Gray <michael.gray@lantisproject.com> | ||||
|  static int kernel_init(void *); | ||||
|   | ||||
|  extern void init_IRQ(void); | ||||
| @@ -540,6 +544,18 @@ asmlinkage __visible void __init start_k | ||||
| @@ -574,6 +578,18 @@ asmlinkage __visible void __init start_k | ||||
|  	page_alloc_init(); | ||||
|   | ||||
|  	pr_notice("Kernel command line: %s\n", boot_command_line); | ||||
|   | ||||
| @@ -9,7 +9,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| --- | ||||
| --- a/drivers/net/ethernet/marvell/mvneta.c | ||||
| +++ b/drivers/net/ethernet/marvell/mvneta.c | ||||
| @@ -3961,6 +3961,15 @@ static int mvneta_ethtool_set_wol(struct | ||||
| @@ -3962,6 +3962,15 @@ static int mvneta_ethtool_set_wol(struct | ||||
|  	return ret; | ||||
|  } | ||||
|   | ||||
| @@ -25,7 +25,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  static const struct net_device_ops mvneta_netdev_ops = { | ||||
|  	.ndo_open            = mvneta_open, | ||||
|  	.ndo_stop            = mvneta_stop, | ||||
| @@ -3971,6 +3980,7 @@ static const struct net_device_ops mvnet | ||||
| @@ -3972,6 +3981,7 @@ static const struct net_device_ops mvnet | ||||
|  	.ndo_fix_features    = mvneta_fix_features, | ||||
|  	.ndo_get_stats64     = mvneta_get_stats64, | ||||
|  	.ndo_do_ioctl        = mvneta_ioctl, | ||||
|   | ||||
| @@ -132,7 +132,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  	u64 ethtool_stats[ARRAY_SIZE(mvneta_statistics)]; | ||||
|   | ||||
|  	u32 indir[MVNETA_RSS_LU_TABLE_SIZE]; | ||||
| @@ -1214,10 +1233,6 @@ static void mvneta_port_disable(struct m | ||||
| @@ -1215,10 +1234,6 @@ static void mvneta_port_disable(struct m | ||||
|  	val &= ~MVNETA_GMAC0_PORT_ENABLE; | ||||
|  	mvreg_write(pp, MVNETA_GMAC_CTRL_0, val); | ||||
|   | ||||
| @@ -143,7 +143,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  	udelay(200); | ||||
|  } | ||||
|   | ||||
| @@ -1277,44 +1292,6 @@ static void mvneta_set_other_mcast_table | ||||
| @@ -1278,44 +1293,6 @@ static void mvneta_set_other_mcast_table | ||||
|  		mvreg_write(pp, MVNETA_DA_FILT_OTH_MCAST + offset, val); | ||||
|  } | ||||
|   | ||||
| @@ -188,7 +188,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  static void mvneta_percpu_unmask_interrupt(void *arg) | ||||
|  { | ||||
|  	struct mvneta_port *pp = arg; | ||||
| @@ -1467,7 +1444,6 @@ static void mvneta_defaults_set(struct m | ||||
| @@ -1468,7 +1445,6 @@ static void mvneta_defaults_set(struct m | ||||
|  	val &= ~MVNETA_PHY_POLLING_ENABLE; | ||||
|  	mvreg_write(pp, MVNETA_UNIT_CONTROL, val); | ||||
|   | ||||
| @@ -196,7 +196,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  	mvneta_set_ucast_table(pp, -1); | ||||
|  	mvneta_set_special_mcast_table(pp, -1); | ||||
|  	mvneta_set_other_mcast_table(pp, -1); | ||||
| @@ -2692,26 +2668,11 @@ static irqreturn_t mvneta_percpu_isr(int | ||||
| @@ -2693,26 +2669,11 @@ static irqreturn_t mvneta_percpu_isr(int | ||||
|  	return IRQ_HANDLED; | ||||
|  } | ||||
|   | ||||
| @@ -225,7 +225,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  } | ||||
|   | ||||
|  /* NAPI handler | ||||
| @@ -2727,7 +2688,6 @@ static int mvneta_poll(struct napi_struc | ||||
| @@ -2728,7 +2689,6 @@ static int mvneta_poll(struct napi_struc | ||||
|  	u32 cause_rx_tx; | ||||
|  	int rx_queue; | ||||
|  	struct mvneta_port *pp = netdev_priv(napi->dev); | ||||
| @@ -233,7 +233,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  	struct mvneta_pcpu_port *port = this_cpu_ptr(pp->ports); | ||||
|   | ||||
|  	if (!netif_running(pp->dev)) { | ||||
| @@ -2741,12 +2701,11 @@ static int mvneta_poll(struct napi_struc | ||||
| @@ -2742,12 +2702,11 @@ static int mvneta_poll(struct napi_struc | ||||
|  		u32 cause_misc = mvreg_read(pp, MVNETA_INTR_MISC_CAUSE); | ||||
|   | ||||
|  		mvreg_write(pp, MVNETA_INTR_MISC_CAUSE, 0); | ||||
| @@ -251,7 +251,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  	} | ||||
|   | ||||
|  	/* Release Tx descriptors */ | ||||
| @@ -3060,7 +3019,6 @@ static int mvneta_setup_txqs(struct mvne | ||||
| @@ -3061,7 +3020,6 @@ static int mvneta_setup_txqs(struct mvne | ||||
|  static void mvneta_start_dev(struct mvneta_port *pp) | ||||
|  { | ||||
|  	int cpu; | ||||
| @@ -259,7 +259,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|   | ||||
|  	mvneta_max_rx_size_set(pp, pp->pkt_size); | ||||
|  	mvneta_txq_max_tx_size_set(pp, pp->pkt_size); | ||||
| @@ -3088,16 +3046,15 @@ static void mvneta_start_dev(struct mvne | ||||
| @@ -3089,16 +3047,15 @@ static void mvneta_start_dev(struct mvne | ||||
|  		    MVNETA_CAUSE_LINK_CHANGE | | ||||
|  		    MVNETA_CAUSE_PSC_SYNC_CHANGE); | ||||
|   | ||||
| @@ -278,7 +278,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|   | ||||
|  	if (!pp->neta_armada3700) { | ||||
|  		for_each_online_cpu(cpu) { | ||||
| @@ -3251,103 +3208,232 @@ static int mvneta_set_mac_addr(struct ne | ||||
| @@ -3252,103 +3209,232 @@ static int mvneta_set_mac_addr(struct ne | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| @@ -585,7 +585,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  } | ||||
|   | ||||
|  /* Electing a CPU must be done in an atomic way: it should be done | ||||
| @@ -3626,10 +3712,9 @@ static int mvneta_stop(struct net_device | ||||
| @@ -3627,10 +3713,9 @@ static int mvneta_stop(struct net_device | ||||
|   | ||||
|  static int mvneta_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) | ||||
|  { | ||||
| @@ -598,7 +598,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  } | ||||
|   | ||||
|  /* Ethtool methods */ | ||||
| @@ -3640,44 +3725,25 @@ mvneta_ethtool_set_link_ksettings(struct | ||||
| @@ -3641,44 +3726,25 @@ mvneta_ethtool_set_link_ksettings(struct | ||||
|  				  const struct ethtool_link_ksettings *cmd) | ||||
|  { | ||||
|  	struct mvneta_port *pp = netdev_priv(ndev); | ||||
| @@ -657,7 +657,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  } | ||||
|   | ||||
|  /* Set interrupt coalescing for ethtools */ | ||||
| @@ -3769,6 +3835,22 @@ static int mvneta_ethtool_set_ringparam( | ||||
| @@ -3770,6 +3836,22 @@ static int mvneta_ethtool_set_ringparam( | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| @@ -680,7 +680,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  static void mvneta_ethtool_get_strings(struct net_device *netdev, u32 sset, | ||||
|  				       u8 *data) | ||||
|  { | ||||
| @@ -3785,26 +3867,35 @@ static void mvneta_ethtool_update_stats( | ||||
| @@ -3786,26 +3868,35 @@ static void mvneta_ethtool_update_stats( | ||||
|  { | ||||
|  	const struct mvneta_statistic *s; | ||||
|  	void __iomem *base = pp->base; | ||||
| @@ -721,7 +721,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  	} | ||||
|  } | ||||
|   | ||||
| @@ -3939,28 +4030,65 @@ static int mvneta_ethtool_get_rxfh(struc | ||||
| @@ -3940,28 +4031,65 @@ static int mvneta_ethtool_get_rxfh(struc | ||||
|  static void mvneta_ethtool_get_wol(struct net_device *dev, | ||||
|  				   struct ethtool_wolinfo *wol) | ||||
|  { | ||||
| @@ -795,7 +795,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  static u16 mvneta_select_queue(struct net_device *dev, struct sk_buff *skb, | ||||
|  			       void *accel_priv, | ||||
|  			       select_queue_fallback_t fallback) | ||||
| @@ -3984,13 +4112,15 @@ static const struct net_device_ops mvnet | ||||
| @@ -3985,13 +4113,15 @@ static const struct net_device_ops mvnet | ||||
|  }; | ||||
|   | ||||
|  static const struct ethtool_ops mvneta_eth_tool_ops = { | ||||
| @@ -812,7 +812,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  	.get_strings	= mvneta_ethtool_get_strings, | ||||
|  	.get_ethtool_stats = mvneta_ethtool_get_stats, | ||||
|  	.get_sset_count	= mvneta_ethtool_get_sset_count, | ||||
| @@ -3998,10 +4128,12 @@ static const struct ethtool_ops mvneta_e | ||||
| @@ -3999,10 +4129,12 @@ static const struct ethtool_ops mvneta_e | ||||
|  	.get_rxnfc	= mvneta_ethtool_get_rxnfc, | ||||
|  	.get_rxfh	= mvneta_ethtool_get_rxfh, | ||||
|  	.set_rxfh	= mvneta_ethtool_set_rxfh, | ||||
| @@ -826,7 +826,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  }; | ||||
|   | ||||
|  /* Initialize hw */ | ||||
| @@ -4146,14 +4278,13 @@ static int mvneta_probe(struct platform_ | ||||
| @@ -4147,14 +4279,13 @@ static int mvneta_probe(struct platform_ | ||||
|  { | ||||
|  	struct resource *res; | ||||
|  	struct device_node *dn = pdev->dev.of_node; | ||||
| @@ -842,7 +842,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  	int tx_csum_limit; | ||||
|  	int phy_mode; | ||||
|  	int err; | ||||
| @@ -4169,31 +4300,11 @@ static int mvneta_probe(struct platform_ | ||||
| @@ -4170,31 +4301,11 @@ static int mvneta_probe(struct platform_ | ||||
|  		goto err_free_netdev; | ||||
|  	} | ||||
|   | ||||
| @@ -875,7 +875,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  	} | ||||
|   | ||||
|  	dev->tx_queue_len = MVNETA_MAX_TXD; | ||||
| @@ -4204,12 +4315,7 @@ static int mvneta_probe(struct platform_ | ||||
| @@ -4205,12 +4316,7 @@ static int mvneta_probe(struct platform_ | ||||
|   | ||||
|  	pp = netdev_priv(dev); | ||||
|  	spin_lock_init(&pp->lock); | ||||
| @@ -889,7 +889,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|   | ||||
|  	pp->rxq_def = rxq_def; | ||||
|   | ||||
| @@ -4231,7 +4337,7 @@ static int mvneta_probe(struct platform_ | ||||
| @@ -4232,7 +4338,7 @@ static int mvneta_probe(struct platform_ | ||||
|  		pp->clk = devm_clk_get(&pdev->dev, NULL); | ||||
|  	if (IS_ERR(pp->clk)) { | ||||
|  		err = PTR_ERR(pp->clk); | ||||
| @@ -898,7 +898,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  	} | ||||
|   | ||||
|  	clk_prepare_enable(pp->clk); | ||||
| @@ -4357,6 +4463,14 @@ static int mvneta_probe(struct platform_ | ||||
| @@ -4358,6 +4464,14 @@ static int mvneta_probe(struct platform_ | ||||
|  	/* 9676 == 9700 - 20 and rounding to 8 */ | ||||
|  	dev->max_mtu = 9676; | ||||
|   | ||||
| @@ -913,7 +913,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  	err = register_netdev(dev); | ||||
|  	if (err < 0) { | ||||
|  		dev_err(&pdev->dev, "failed to register\n"); | ||||
| @@ -4368,14 +4482,6 @@ static int mvneta_probe(struct platform_ | ||||
| @@ -4369,14 +4483,6 @@ static int mvneta_probe(struct platform_ | ||||
|   | ||||
|  	platform_set_drvdata(pdev, pp->dev); | ||||
|   | ||||
| @@ -928,7 +928,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  	return 0; | ||||
|   | ||||
|  err_netdev: | ||||
| @@ -4386,16 +4492,14 @@ err_netdev: | ||||
| @@ -4387,16 +4493,14 @@ err_netdev: | ||||
|  				       1 << pp->id); | ||||
|  	} | ||||
|  err_free_stats: | ||||
| @@ -947,7 +947,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  err_free_irq: | ||||
|  	irq_dispose_mapping(dev->irq); | ||||
|  err_free_netdev: | ||||
| @@ -4407,7 +4511,6 @@ err_free_netdev: | ||||
| @@ -4408,7 +4512,6 @@ err_free_netdev: | ||||
|  static int mvneta_remove(struct platform_device *pdev) | ||||
|  { | ||||
|  	struct net_device  *dev = platform_get_drvdata(pdev); | ||||
| @@ -955,7 +955,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  	struct mvneta_port *pp = netdev_priv(dev); | ||||
|   | ||||
|  	unregister_netdev(dev); | ||||
| @@ -4415,10 +4518,8 @@ static int mvneta_remove(struct platform | ||||
| @@ -4416,10 +4519,8 @@ static int mvneta_remove(struct platform | ||||
|  	clk_disable_unprepare(pp->clk); | ||||
|  	free_percpu(pp->ports); | ||||
|  	free_percpu(pp->stats); | ||||
| @@ -967,7 +967,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  	free_netdev(dev); | ||||
|   | ||||
|  	if (pp->bm_priv) { | ||||
| @@ -4470,9 +4571,6 @@ static int mvneta_resume(struct device * | ||||
| @@ -4471,9 +4572,6 @@ static int mvneta_resume(struct device * | ||||
|  		return err; | ||||
|  	} | ||||
|   | ||||
|   | ||||
| @@ -18,7 +18,7 @@ Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> | ||||
|  	struct device_node *dn; | ||||
|  	unsigned int tx_csum_limit; | ||||
|  	struct phylink *phylink; | ||||
| @@ -4315,6 +4316,7 @@ static int mvneta_probe(struct platform_ | ||||
| @@ -4316,6 +4317,7 @@ static int mvneta_probe(struct platform_ | ||||
|   | ||||
|  	pp = netdev_priv(dev); | ||||
|  	spin_lock_init(&pp->lock); | ||||
|   | ||||
| @@ -14,7 +14,7 @@ Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> | ||||
|  | ||||
| --- a/drivers/net/ethernet/marvell/mvneta.c | ||||
| +++ b/drivers/net/ethernet/marvell/mvneta.c | ||||
| @@ -2704,8 +2704,7 @@ static int mvneta_poll(struct napi_struc | ||||
| @@ -2705,8 +2705,7 @@ static int mvneta_poll(struct napi_struc | ||||
|  		mvreg_write(pp, MVNETA_INTR_MISC_CAUSE, 0); | ||||
|   | ||||
|  		if (cause_misc & (MVNETA_CAUSE_PHY_STATUS_CHANGE | | ||||
| @@ -24,7 +24,7 @@ Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> | ||||
|  			mvneta_link_change(pp); | ||||
|  	} | ||||
|   | ||||
| @@ -3044,8 +3043,7 @@ static void mvneta_start_dev(struct mvne | ||||
| @@ -3045,8 +3044,7 @@ static void mvneta_start_dev(struct mvne | ||||
|   | ||||
|  	mvreg_write(pp, MVNETA_INTR_MISC_MASK, | ||||
|  		    MVNETA_CAUSE_PHY_STATUS_CHANGE | | ||||
| @@ -34,7 +34,7 @@ Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> | ||||
|   | ||||
|  	phylink_start(pp->phylink); | ||||
|  	netif_tx_start_all_queues(pp->dev); | ||||
| @@ -3542,8 +3540,7 @@ static int mvneta_cpu_online(unsigned in | ||||
| @@ -3543,8 +3541,7 @@ static int mvneta_cpu_online(unsigned in | ||||
|  	on_each_cpu(mvneta_percpu_unmask_interrupt, pp, true); | ||||
|  	mvreg_write(pp, MVNETA_INTR_MISC_MASK, | ||||
|  		    MVNETA_CAUSE_PHY_STATUS_CHANGE | | ||||
| @@ -44,7 +44,7 @@ Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> | ||||
|  	netif_tx_start_all_queues(pp->dev); | ||||
|  	spin_unlock(&pp->lock); | ||||
|  	return 0; | ||||
| @@ -3584,8 +3581,7 @@ static int mvneta_cpu_dead(unsigned int | ||||
| @@ -3585,8 +3582,7 @@ static int mvneta_cpu_dead(unsigned int | ||||
|  	on_each_cpu(mvneta_percpu_unmask_interrupt, pp, true); | ||||
|  	mvreg_write(pp, MVNETA_INTR_MISC_MASK, | ||||
|  		    MVNETA_CAUSE_PHY_STATUS_CHANGE | | ||||
|   | ||||
| @@ -10,7 +10,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  | ||||
| --- a/drivers/net/ethernet/marvell/mvneta.c | ||||
| +++ b/drivers/net/ethernet/marvell/mvneta.c | ||||
| @@ -4045,6 +4045,22 @@ static int mvneta_ethtool_set_wol(struct | ||||
| @@ -4046,6 +4046,22 @@ static int mvneta_ethtool_set_wol(struct | ||||
|  	return ret; | ||||
|  } | ||||
|   | ||||
| @@ -33,7 +33,7 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> | ||||
|  static int mvneta_ethtool_get_eee(struct net_device *dev, | ||||
|  				  struct ethtool_eee *eee) | ||||
|  { | ||||
| @@ -4129,6 +4145,8 @@ static const struct ethtool_ops mvneta_e | ||||
| @@ -4130,6 +4146,8 @@ static const struct ethtool_ops mvneta_e | ||||
|  	.set_link_ksettings = mvneta_ethtool_set_link_ksettings, | ||||
|  	.get_wol        = mvneta_ethtool_get_wol, | ||||
|  	.set_wol        = mvneta_ethtool_set_wol, | ||||
|   | ||||
| @@ -15,7 +15,7 @@ Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> | ||||
|  | ||||
| --- a/drivers/net/ethernet/marvell/mvneta.c | ||||
| +++ b/drivers/net/ethernet/marvell/mvneta.c | ||||
| @@ -4045,22 +4045,6 @@ static int mvneta_ethtool_set_wol(struct | ||||
| @@ -4046,22 +4046,6 @@ static int mvneta_ethtool_set_wol(struct | ||||
|  	return ret; | ||||
|  } | ||||
|   | ||||
| @@ -38,7 +38,7 @@ Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> | ||||
|  static int mvneta_ethtool_get_eee(struct net_device *dev, | ||||
|  				  struct ethtool_eee *eee) | ||||
|  { | ||||
| @@ -4145,8 +4129,6 @@ static const struct ethtool_ops mvneta_e | ||||
| @@ -4146,8 +4130,6 @@ static const struct ethtool_ops mvneta_e | ||||
|  	.set_link_ksettings = mvneta_ethtool_set_link_ksettings, | ||||
|  	.get_wol        = mvneta_ethtool_get_wol, | ||||
|  	.set_wol        = mvneta_ethtool_set_wol, | ||||
|   | ||||
| @@ -18,7 +18,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org> | ||||
|   | ||||
|  #include <linux/usb/hcd.h> | ||||
|  #include <linux/usb/ch11.h> | ||||
| @@ -5075,6 +5076,8 @@ int dwc2_hcd_init(struct dwc2_hsotg *hso | ||||
| @@ -5105,6 +5106,8 @@ int dwc2_hcd_init(struct dwc2_hsotg *hso | ||||
|   | ||||
|  	retval = -ENOMEM; | ||||
|   | ||||
|   | ||||
		Reference in New Issue
	
	Block a user