mirror of
https://github.com/openwrt/openwrt.git
synced 2025-01-17 10:20:01 +00:00
lantiq: kernel 4.14: update patches and config
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> Signed-off-by: Mathias Kresin <dev@kresin.me>
This commit is contained in:
parent
5eeaba31b8
commit
f1d84023cb
@ -3,6 +3,7 @@ CONFIG_CPU_MIPS32_R1=y
|
|||||||
# CONFIG_CPU_MIPS32_R2 is not set
|
# CONFIG_CPU_MIPS32_R2 is not set
|
||||||
CONFIG_CPU_MIPSR1=y
|
CONFIG_CPU_MIPSR1=y
|
||||||
CONFIG_CRC16=y
|
CONFIG_CRC16=y
|
||||||
|
CONFIG_CRYPTO_ACOMP2=y
|
||||||
CONFIG_CRYPTO_DEFLATE=y
|
CONFIG_CRYPTO_DEFLATE=y
|
||||||
CONFIG_FIRMWARE_IN_KERNEL=y
|
CONFIG_FIRMWARE_IN_KERNEL=y
|
||||||
CONFIG_FIRMWARE_MEMMAP=y
|
CONFIG_FIRMWARE_MEMMAP=y
|
||||||
|
@ -5,12 +5,21 @@ CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
|
|||||||
# CONFIG_ARCH_HAS_GCOV_PROFILE_ALL is not set
|
# CONFIG_ARCH_HAS_GCOV_PROFILE_ALL is not set
|
||||||
CONFIG_ARCH_HAS_RESET_CONTROLLER=y
|
CONFIG_ARCH_HAS_RESET_CONTROLLER=y
|
||||||
# CONFIG_ARCH_HAS_SG_CHAIN is not set
|
# CONFIG_ARCH_HAS_SG_CHAIN is not set
|
||||||
|
# CONFIG_ARCH_HAS_STRICT_KERNEL_RWX is not set
|
||||||
|
# CONFIG_ARCH_HAS_STRICT_MODULE_RWX is not set
|
||||||
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||||
CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
|
CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
|
||||||
CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y
|
CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y
|
||||||
|
CONFIG_ARCH_MMAP_RND_BITS_MAX=15
|
||||||
|
CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=15
|
||||||
|
# CONFIG_ARCH_OPTIONAL_KERNEL_RWX is not set
|
||||||
|
# CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT is not set
|
||||||
CONFIG_ARCH_SUPPORTS_UPROBES=y
|
CONFIG_ARCH_SUPPORTS_UPROBES=y
|
||||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||||
CONFIG_ARCH_USE_BUILTIN_BSWAP=y
|
CONFIG_ARCH_USE_BUILTIN_BSWAP=y
|
||||||
|
CONFIG_ARCH_USE_QUEUED_RWLOCKS=y
|
||||||
|
CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y
|
||||||
|
# CONFIG_ARCH_WANTS_THP_SWAP is not set
|
||||||
CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
|
CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
|
||||||
CONFIG_CEVT_R4K=y
|
CONFIG_CEVT_R4K=y
|
||||||
CONFIG_CLKDEV_LOOKUP=y
|
CONFIG_CLKDEV_LOOKUP=y
|
||||||
@ -36,18 +45,27 @@ CONFIG_CRYPTO_RNG2=y
|
|||||||
CONFIG_CRYPTO_WORKQUEUE=y
|
CONFIG_CRYPTO_WORKQUEUE=y
|
||||||
CONFIG_CSRC_R4K=y
|
CONFIG_CSRC_R4K=y
|
||||||
CONFIG_DMA_NONCOHERENT=y
|
CONFIG_DMA_NONCOHERENT=y
|
||||||
|
# CONFIG_DMA_NOOP_OPS is not set
|
||||||
|
# CONFIG_DMA_VIRT_OPS is not set
|
||||||
|
# CONFIG_DRM_LIB_RANDOM is not set
|
||||||
CONFIG_DTC=y
|
CONFIG_DTC=y
|
||||||
# CONFIG_DT_EASY50712 is not set
|
# CONFIG_DT_EASY50712 is not set
|
||||||
CONFIG_EARLY_PRINTK=y
|
CONFIG_EARLY_PRINTK=y
|
||||||
CONFIG_ETHERNET_PACKET_MANGLE=y
|
CONFIG_ETHERNET_PACKET_MANGLE=y
|
||||||
|
CONFIG_EXPORTFS=y
|
||||||
CONFIG_FIXED_PHY=y
|
CONFIG_FIXED_PHY=y
|
||||||
|
CONFIG_FUTEX_PI=y
|
||||||
CONFIG_GENERIC_ATOMIC64=y
|
CONFIG_GENERIC_ATOMIC64=y
|
||||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||||
CONFIG_GENERIC_CMOS_UPDATE=y
|
CONFIG_GENERIC_CMOS_UPDATE=y
|
||||||
|
CONFIG_GENERIC_CPU_AUTOPROBE=y
|
||||||
CONFIG_GENERIC_IO=y
|
CONFIG_GENERIC_IO=y
|
||||||
CONFIG_GENERIC_IRQ_CHIP=y
|
CONFIG_GENERIC_IRQ_CHIP=y
|
||||||
|
CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
|
||||||
|
CONFIG_GENERIC_IRQ_IPI=y
|
||||||
CONFIG_GENERIC_IRQ_SHOW=y
|
CONFIG_GENERIC_IRQ_SHOW=y
|
||||||
CONFIG_GENERIC_PCI_IOMAP=y
|
CONFIG_GENERIC_PCI_IOMAP=y
|
||||||
|
CONFIG_GENERIC_PHY=y
|
||||||
CONFIG_GENERIC_SCHED_CLOCK=y
|
CONFIG_GENERIC_SCHED_CLOCK=y
|
||||||
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
||||||
CONFIG_GENERIC_TIME_VSYSCALL=y
|
CONFIG_GENERIC_TIME_VSYSCALL=y
|
||||||
@ -55,6 +73,7 @@ CONFIG_GPIOLIB=y
|
|||||||
CONFIG_GPIO_MM_LANTIQ=y
|
CONFIG_GPIO_MM_LANTIQ=y
|
||||||
CONFIG_GPIO_STP_XWAY=y
|
CONFIG_GPIO_STP_XWAY=y
|
||||||
CONFIG_GPIO_SYSFS=y
|
CONFIG_GPIO_SYSFS=y
|
||||||
|
# CONFIG_GRO_CELLS is not set
|
||||||
CONFIG_HANDLE_DOMAIN_IRQ=y
|
CONFIG_HANDLE_DOMAIN_IRQ=y
|
||||||
CONFIG_HARDWARE_WATCHPOINTS=y
|
CONFIG_HARDWARE_WATCHPOINTS=y
|
||||||
CONFIG_HAS_DMA=y
|
CONFIG_HAS_DMA=y
|
||||||
@ -71,6 +90,7 @@ CONFIG_HAVE_CBPF_JIT=y
|
|||||||
CONFIG_HAVE_CC_STACKPROTECTOR=y
|
CONFIG_HAVE_CC_STACKPROTECTOR=y
|
||||||
CONFIG_HAVE_CLK=y
|
CONFIG_HAVE_CLK=y
|
||||||
CONFIG_HAVE_CONTEXT_TRACKING=y
|
CONFIG_HAVE_CONTEXT_TRACKING=y
|
||||||
|
CONFIG_HAVE_COPY_THREAD_TLS=y
|
||||||
CONFIG_HAVE_C_RECORDMCOUNT=y
|
CONFIG_HAVE_C_RECORDMCOUNT=y
|
||||||
CONFIG_HAVE_DEBUG_KMEMLEAK=y
|
CONFIG_HAVE_DEBUG_KMEMLEAK=y
|
||||||
CONFIG_HAVE_DEBUG_STACKOVERFLOW=y
|
CONFIG_HAVE_DEBUG_STACKOVERFLOW=y
|
||||||
@ -104,6 +124,7 @@ CONFIG_HZ_PERIODIC=y
|
|||||||
CONFIG_INITRAMFS_SOURCE=""
|
CONFIG_INITRAMFS_SOURCE=""
|
||||||
CONFIG_IRQCHIP=y
|
CONFIG_IRQCHIP=y
|
||||||
CONFIG_IRQ_DOMAIN=y
|
CONFIG_IRQ_DOMAIN=y
|
||||||
|
CONFIG_IRQ_DOMAIN_HIERARCHY=y
|
||||||
CONFIG_IRQ_FORCED_THREADING=y
|
CONFIG_IRQ_FORCED_THREADING=y
|
||||||
CONFIG_IRQ_MIPS_CPU=y
|
CONFIG_IRQ_MIPS_CPU=y
|
||||||
CONFIG_IRQ_WORK=y
|
CONFIG_IRQ_WORK=y
|
||||||
@ -114,7 +135,10 @@ CONFIG_LANTIQ_WDT=y
|
|||||||
# CONFIG_LANTIQ_XRX200 is not set
|
# CONFIG_LANTIQ_XRX200 is not set
|
||||||
CONFIG_LEDS_GPIO=y
|
CONFIG_LEDS_GPIO=y
|
||||||
CONFIG_LIBFDT=y
|
CONFIG_LIBFDT=y
|
||||||
CONFIG_MDIO_BOARDINFO=y
|
CONFIG_MDIO_BUS=y
|
||||||
|
CONFIG_MDIO_DEVICE=y
|
||||||
|
CONFIG_MFD_CORE=y
|
||||||
|
CONFIG_MFD_SYSCON=y
|
||||||
CONFIG_MIPS=y
|
CONFIG_MIPS=y
|
||||||
CONFIG_MIPS_ASID_BITS=8
|
CONFIG_MIPS_ASID_BITS=8
|
||||||
CONFIG_MIPS_ASID_SHIFT=0
|
CONFIG_MIPS_ASID_SHIFT=0
|
||||||
@ -160,13 +184,20 @@ CONFIG_PCI_DRIVERS_LEGACY=y
|
|||||||
CONFIG_PERF_USE_VMALLOC=y
|
CONFIG_PERF_USE_VMALLOC=y
|
||||||
CONFIG_PGTABLE_LEVELS=2
|
CONFIG_PGTABLE_LEVELS=2
|
||||||
CONFIG_PHYLIB=y
|
CONFIG_PHYLIB=y
|
||||||
|
CONFIG_PHY_LANTIQ_RCU_USB2=y
|
||||||
CONFIG_PINCTRL=y
|
CONFIG_PINCTRL=y
|
||||||
CONFIG_PINCTRL_LANTIQ=y
|
CONFIG_PINCTRL_LANTIQ=y
|
||||||
# CONFIG_PINCTRL_SINGLE is not set
|
# CONFIG_PINCTRL_SINGLE is not set
|
||||||
CONFIG_PINCTRL_XWAY=y
|
CONFIG_PINCTRL_XWAY=y
|
||||||
|
CONFIG_POWER_RESET=y
|
||||||
|
CONFIG_POWER_RESET_SYSCON=y
|
||||||
CONFIG_PSB6970_PHY=y
|
CONFIG_PSB6970_PHY=y
|
||||||
|
# CONFIG_RCU_NEED_SEGCBLIST is not set
|
||||||
# CONFIG_RCU_STALL_COMMON is not set
|
# CONFIG_RCU_STALL_COMMON is not set
|
||||||
|
CONFIG_REGMAP=y
|
||||||
|
CONFIG_REGMAP_MMIO=y
|
||||||
CONFIG_RESET_CONTROLLER=y
|
CONFIG_RESET_CONTROLLER=y
|
||||||
|
CONFIG_RESET_LANTIQ=y
|
||||||
CONFIG_RTL8366RB_PHY=y
|
CONFIG_RTL8366RB_PHY=y
|
||||||
CONFIG_RTL8366_SMI=y
|
CONFIG_RTL8366_SMI=y
|
||||||
# CONFIG_SCHED_INFO is not set
|
# CONFIG_SCHED_INFO is not set
|
||||||
@ -194,6 +225,8 @@ CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
|
|||||||
CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y
|
CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y
|
||||||
CONFIG_SYS_SUPPORTS_MIPS16=y
|
CONFIG_SYS_SUPPORTS_MIPS16=y
|
||||||
CONFIG_SYS_SUPPORTS_MULTITHREADING=y
|
CONFIG_SYS_SUPPORTS_MULTITHREADING=y
|
||||||
|
CONFIG_THIN_ARCHIVES=y
|
||||||
CONFIG_TICK_CPU_ACCOUNTING=y
|
CONFIG_TICK_CPU_ACCOUNTING=y
|
||||||
|
CONFIG_TINY_SRCU=y
|
||||||
CONFIG_USE_OF=y
|
CONFIG_USE_OF=y
|
||||||
# CONFIG_XRX200_PHY_FW is not set
|
# CONFIG_XRX200_PHY_FW is not set
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
|
# CONFIG_MFD_CORE is not set
|
||||||
CONFIG_MTD_NAND=y
|
CONFIG_MTD_NAND=y
|
||||||
CONFIG_MTD_NAND_ECC=y
|
CONFIG_MTD_NAND_ECC=y
|
||||||
CONFIG_MTD_SPLIT_FIRMWARE_NAME="linux"
|
CONFIG_MTD_SPLIT_FIRMWARE_NAME="linux"
|
||||||
CONFIG_PINCTRL_FALCON=y
|
CONFIG_PINCTRL_FALCON=y
|
||||||
# CONFIG_PSB6970_PHY is not set
|
# CONFIG_PSB6970_PHY is not set
|
||||||
|
# CONFIG_RESET_LANTIQ is not set
|
||||||
# CONFIG_RTL8366_SMI is not set
|
# CONFIG_RTL8366_SMI is not set
|
||||||
CONFIG_SOC_FALCON=y
|
CONFIG_SOC_FALCON=y
|
||||||
# CONFIG_SOC_TYPE_XWAY is not set
|
# CONFIG_SOC_TYPE_XWAY is not set
|
||||||
|
@ -41,15 +41,15 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
|
|
||||||
--- a/arch/mips/lantiq/Kconfig
|
--- a/arch/mips/lantiq/Kconfig
|
||||||
+++ b/arch/mips/lantiq/Kconfig
|
+++ b/arch/mips/lantiq/Kconfig
|
||||||
@@ -17,6 +17,7 @@ config SOC_XWAY
|
@@ -18,6 +18,7 @@ config SOC_XWAY
|
||||||
bool "XWAY"
|
bool "XWAY"
|
||||||
select SOC_TYPE_XWAY
|
select SOC_TYPE_XWAY
|
||||||
select HW_HAS_PCI
|
select HW_HAS_PCI
|
||||||
+ select ARCH_SUPPORTS_MSI
|
+ select ARCH_SUPPORTS_MSI
|
||||||
|
select MFD_SYSCON
|
||||||
|
select MFD_CORE
|
||||||
|
|
||||||
config SOC_FALCON
|
@@ -50,6 +51,15 @@ config PCI_LANTIQ
|
||||||
bool "FALCON"
|
|
||||||
@@ -47,6 +48,15 @@ config PCI_LANTIQ
|
|
||||||
bool "PCI Support"
|
bool "PCI Support"
|
||||||
depends on SOC_XWAY && PCI
|
depends on SOC_XWAY && PCI
|
||||||
|
|
||||||
@ -67,7 +67,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
depends on SOC_XWAY
|
depends on SOC_XWAY
|
||||||
--- a/arch/mips/pci/Makefile
|
--- a/arch/mips/pci/Makefile
|
||||||
+++ b/arch/mips/pci/Makefile
|
+++ b/arch/mips/pci/Makefile
|
||||||
@@ -48,6 +48,8 @@ obj-$(CONFIG_PCI_LANTIQ) += pci-lantiq.o
|
@@ -49,6 +49,8 @@ obj-$(CONFIG_PCI_LANTIQ) += pci-lantiq.o
|
||||||
obj-$(CONFIG_SOC_MT7620) += pci-mt7620.o
|
obj-$(CONFIG_SOC_MT7620) += pci-mt7620.o
|
||||||
obj-$(CONFIG_SOC_RT288X) += pci-rt2880.o
|
obj-$(CONFIG_SOC_RT288X) += pci-rt2880.o
|
||||||
obj-$(CONFIG_SOC_RT3883) += pci-rt3883.o
|
obj-$(CONFIG_SOC_RT3883) += pci-rt3883.o
|
||||||
@ -176,7 +176,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
|
|
||||||
@@ -25,5 +31,10 @@ int pcibios_plat_dev_init(struct pci_dev
|
@@ -25,5 +31,10 @@ int pcibios_plat_dev_init(struct pci_dev
|
||||||
|
|
||||||
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
+#ifdef CONFIG_PCIE_LANTIQ
|
+#ifdef CONFIG_PCIE_LANTIQ
|
||||||
+ if (pci_find_capability(dev, PCI_CAP_ID_EXP))
|
+ if (pci_find_capability(dev, PCI_CAP_ID_EXP))
|
||||||
@ -4143,7 +4143,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
+
|
+
|
||||||
--- a/arch/mips/pci/pci-legacy.c
|
--- a/arch/mips/pci/pci-legacy.c
|
||||||
+++ b/arch/mips/pci/pci-legacy.c
|
+++ b/arch/mips/pci/pci-legacy.c
|
||||||
@@ -300,3 +300,30 @@ char *__init pcibios_setup(char *str)
|
@@ -309,3 +309,30 @@ char *__init pcibios_setup(char *str)
|
||||||
return pcibios_plat_setup(str);
|
return pcibios_plat_setup(str);
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
@ -5494,7 +5494,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
(transaction layer end-to-end CRC checking).
|
(transaction layer end-to-end CRC checking).
|
||||||
--- a/include/linux/pci.h
|
--- a/include/linux/pci.h
|
||||||
+++ b/include/linux/pci.h
|
+++ b/include/linux/pci.h
|
||||||
@@ -1250,6 +1250,8 @@ void pci_walk_bus(struct pci_bus *top, i
|
@@ -1300,6 +1300,8 @@ void pci_walk_bus(struct pci_bus *top, i
|
||||||
void *userdata);
|
void *userdata);
|
||||||
int pci_cfg_space_size(struct pci_dev *dev);
|
int pci_cfg_space_size(struct pci_dev *dev);
|
||||||
unsigned char pci_bus_max_busnr(struct pci_bus *bus);
|
unsigned char pci_bus_max_busnr(struct pci_bus *bus);
|
||||||
@ -5505,7 +5505,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
unsigned long type);
|
unsigned long type);
|
||||||
--- a/include/linux/pci_ids.h
|
--- a/include/linux/pci_ids.h
|
||||||
+++ b/include/linux/pci_ids.h
|
+++ b/include/linux/pci_ids.h
|
||||||
@@ -1056,6 +1056,12 @@
|
@@ -1061,6 +1061,12 @@
|
||||||
#define PCI_DEVICE_ID_SGI_LITHIUM 0x1002
|
#define PCI_DEVICE_ID_SGI_LITHIUM 0x1002
|
||||||
#define PCI_DEVICE_ID_SGI_IOC4 0x100a
|
#define PCI_DEVICE_ID_SGI_IOC4 0x100a
|
||||||
|
|
||||||
|
@ -431,7 +431,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
|
|
||||||
#include <asm/bootinfo.h>
|
#include <asm/bootinfo.h>
|
||||||
#include <asm/irq_cpu.h>
|
#include <asm/irq_cpu.h>
|
||||||
@@ -100,6 +101,7 @@ void ltq_mask_and_ack_irq(struct irq_dat
|
@@ -96,6 +97,7 @@ void ltq_mask_and_ack_irq(struct irq_dat
|
||||||
ltq_icu_w32(im, ltq_icu_r32(im, ier) & ~BIT(offset), ier);
|
ltq_icu_w32(im, ltq_icu_r32(im, ier) & ~BIT(offset), ier);
|
||||||
ltq_icu_w32(im, BIT(offset), isr);
|
ltq_icu_w32(im, BIT(offset), isr);
|
||||||
}
|
}
|
||||||
@ -441,7 +441,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
{
|
{
|
||||||
--- a/arch/mips/mm/cache.c
|
--- a/arch/mips/mm/cache.c
|
||||||
+++ b/arch/mips/mm/cache.c
|
+++ b/arch/mips/mm/cache.c
|
||||||
@@ -63,6 +63,8 @@ void (*_dma_cache_wback)(unsigned long s
|
@@ -64,6 +64,8 @@ void (*_dma_cache_wback)(unsigned long s
|
||||||
void (*_dma_cache_inv)(unsigned long start, unsigned long size);
|
void (*_dma_cache_inv)(unsigned long start, unsigned long size);
|
||||||
|
|
||||||
EXPORT_SYMBOL(_dma_cache_wback_inv);
|
EXPORT_SYMBOL(_dma_cache_wback_inv);
|
||||||
@ -452,7 +452,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
|
|
||||||
--- a/include/uapi/linux/atm.h
|
--- a/include/uapi/linux/atm.h
|
||||||
+++ b/include/uapi/linux/atm.h
|
+++ b/include/uapi/linux/atm.h
|
||||||
@@ -130,8 +130,14 @@
|
@@ -131,8 +131,14 @@
|
||||||
#define ATM_ABR 4
|
#define ATM_ABR 4
|
||||||
#define ATM_ANYCLASS 5 /* compatible with everything */
|
#define ATM_ANYCLASS 5 /* compatible with everything */
|
||||||
|
|
||||||
@ -469,16 +469,15 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
int max_pcr; /* maximum PCR in cells per second */
|
int max_pcr; /* maximum PCR in cells per second */
|
||||||
--- a/net/atm/common.c
|
--- a/net/atm/common.c
|
||||||
+++ b/net/atm/common.c
|
+++ b/net/atm/common.c
|
||||||
@@ -62,11 +62,17 @@ static void vcc_remove_socket(struct soc
|
@@ -62,10 +62,16 @@ static void vcc_remove_socket(struct soc
|
||||||
write_unlock_irq(&vcc_sklist_lock);
|
write_unlock_irq(&vcc_sklist_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
+struct sk_buff* (*ifx_atm_alloc_tx)(struct atm_vcc *, unsigned int) = NULL;
|
+struct sk_buff* (*ifx_atm_alloc_tx)(struct atm_vcc *, unsigned int) = NULL;
|
||||||
+EXPORT_SYMBOL(ifx_atm_alloc_tx);
|
+EXPORT_SYMBOL(ifx_atm_alloc_tx);
|
||||||
+
|
+
|
||||||
static struct sk_buff *alloc_tx(struct atm_vcc *vcc, unsigned int size)
|
static bool vcc_tx_ready(struct atm_vcc *vcc, unsigned int size)
|
||||||
{
|
{
|
||||||
struct sk_buff *skb;
|
|
||||||
struct sock *sk = sk_atm(vcc);
|
struct sock *sk = sk_atm(vcc);
|
||||||
|
|
||||||
+ if (ifx_atm_alloc_tx != NULL)
|
+ if (ifx_atm_alloc_tx != NULL)
|
||||||
@ -489,7 +488,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
sk_wmem_alloc_get(sk), size, sk->sk_sndbuf);
|
sk_wmem_alloc_get(sk), size, sk->sk_sndbuf);
|
||||||
--- a/net/atm/proc.c
|
--- a/net/atm/proc.c
|
||||||
+++ b/net/atm/proc.c
|
+++ b/net/atm/proc.c
|
||||||
@@ -154,7 +154,7 @@ static void *vcc_seq_next(struct seq_fil
|
@@ -155,7 +155,7 @@ static void *vcc_seq_next(struct seq_fil
|
||||||
static void pvc_info(struct seq_file *seq, struct atm_vcc *vcc)
|
static void pvc_info(struct seq_file *seq, struct atm_vcc *vcc)
|
||||||
{
|
{
|
||||||
static const char *const class_name[] = {
|
static const char *const class_name[] = {
|
||||||
|
@ -172,9 +172,9 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
+#endif /* __DANUBE_GPTU_DEV_H__2005_07_26__10_19__ */
|
+#endif /* __DANUBE_GPTU_DEV_H__2005_07_26__10_19__ */
|
||||||
--- a/arch/mips/lantiq/xway/Makefile
|
--- a/arch/mips/lantiq/xway/Makefile
|
||||||
+++ b/arch/mips/lantiq/xway/Makefile
|
+++ b/arch/mips/lantiq/xway/Makefile
|
||||||
@@ -1,4 +1,10 @@
|
@@ -1,3 +1,9 @@
|
||||||
-obj-y := prom.o sysctrl.o clk.o reset.o dma.o gptu.o dcdc.o
|
-obj-y := prom.o sysctrl.o clk.o dma.o gptu.o dcdc.o
|
||||||
+obj-y := prom.o sysctrl.o clk.o reset.o dma.o dcdc.o
|
+obj-y := prom.o sysctrl.o clk.o dma.o dcdc.o
|
||||||
+
|
+
|
||||||
+ifdef CONFIG_SOC_AMAZON_SE
|
+ifdef CONFIG_SOC_AMAZON_SE
|
||||||
+obj-y += gptu.o
|
+obj-y += gptu.o
|
||||||
@ -183,10 +183,9 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
+endif
|
+endif
|
||||||
|
|
||||||
obj-y += vmmc.o
|
obj-y += vmmc.o
|
||||||
|
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/arch/mips/lantiq/xway/timer.c
|
+++ b/arch/mips/lantiq/xway/timer.c
|
||||||
@@ -0,0 +1,845 @@
|
@@ -0,0 +1,846 @@
|
||||||
+#ifndef CONFIG_SOC_AMAZON_SE
|
+#ifndef CONFIG_SOC_AMAZON_SE
|
||||||
+
|
+
|
||||||
+#include <linux/kernel.h>
|
+#include <linux/kernel.h>
|
||||||
@ -201,6 +200,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
+#include <linux/errno.h>
|
+#include <linux/errno.h>
|
||||||
+#include <linux/interrupt.h>
|
+#include <linux/interrupt.h>
|
||||||
+#include <linux/sched.h>
|
+#include <linux/sched.h>
|
||||||
|
+#include <linux/sched/signal.h>
|
||||||
+
|
+
|
||||||
+#include <asm/irq.h>
|
+#include <asm/irq.h>
|
||||||
+#include <asm/div64.h>
|
+#include <asm/div64.h>
|
||||||
@ -880,14 +880,14 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
+ int ret;
|
+ int ret;
|
||||||
+ struct gptu_ioctl_param param;
|
+ struct gptu_ioctl_param param;
|
||||||
+
|
+
|
||||||
+ if (!access_ok(VERIFY_READ, arg, sizeof(struct gptu_ioctl_param)))
|
+ if (!access_ok(VERIFY_READ, (void __user *)arg, sizeof(struct gptu_ioctl_param)))
|
||||||
+ return -EFAULT;
|
+ return -EFAULT;
|
||||||
+ copy_from_user(¶m, (void *) arg, sizeof(param));
|
+ copy_from_user(¶m, (void __user *)arg, sizeof(param));
|
||||||
+
|
+
|
||||||
+ if ((((cmd == GPTU_REQUEST_TIMER || cmd == GPTU_SET_TIMER
|
+ if ((((cmd == GPTU_REQUEST_TIMER || cmd == GPTU_SET_TIMER
|
||||||
+ || GPTU_SET_COUNTER) && param.timer < 2)
|
+ || GPTU_SET_COUNTER) && param.timer < 2)
|
||||||
+ || cmd == GPTU_GET_COUNT_VALUE || cmd == GPTU_CALCULATE_DIVIDER)
|
+ || cmd == GPTU_GET_COUNT_VALUE || cmd == GPTU_CALCULATE_DIVIDER)
|
||||||
+ && !access_ok(VERIFY_WRITE, arg,
|
+ && !access_ok(VERIFY_WRITE, (void __user *)arg,
|
||||||
+ sizeof(struct gptu_ioctl_param)))
|
+ sizeof(struct gptu_ioctl_param)))
|
||||||
+ return -EFAULT;
|
+ return -EFAULT;
|
||||||
+
|
+
|
||||||
|
@ -10,7 +10,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
|
|
||||||
--- a/drivers/mtd/maps/lantiq-flash.c
|
--- a/drivers/mtd/maps/lantiq-flash.c
|
||||||
+++ b/drivers/mtd/maps/lantiq-flash.c
|
+++ b/drivers/mtd/maps/lantiq-flash.c
|
||||||
@@ -137,7 +137,11 @@ ltq_mtd_probe(struct platform_device *pd
|
@@ -131,7 +131,11 @@ ltq_mtd_probe(struct platform_device *pd
|
||||||
if (!ltq_mtd->map)
|
if (!ltq_mtd->map)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
@ -22,8 +22,8 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
|
|
||||||
#include <linux/mtd/mtd.h>
|
#include <linux/mtd/mtd.h>
|
||||||
#include <linux/mtd/partitions.h>
|
#include <linux/mtd/partitions.h>
|
||||||
@@ -198,6 +199,10 @@ static int m25p_probe(struct spi_device
|
@@ -243,6 +244,10 @@ static int m25p_probe(struct spi_device
|
||||||
enum read_mode mode = SPI_NOR_NORMAL;
|
};
|
||||||
char *flash_name;
|
char *flash_name;
|
||||||
int ret;
|
int ret;
|
||||||
+ const char __maybe_unused *of_mtd_name = NULL;
|
+ const char __maybe_unused *of_mtd_name = NULL;
|
||||||
@ -33,7 +33,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
|
|
||||||
data = dev_get_platdata(&spi->dev);
|
data = dev_get_platdata(&spi->dev);
|
||||||
|
|
||||||
@@ -227,6 +232,8 @@ static int m25p_probe(struct spi_device
|
@@ -281,6 +286,8 @@ static int m25p_probe(struct spi_device
|
||||||
|
|
||||||
if (data && data->name)
|
if (data && data->name)
|
||||||
nor->mtd.name = data->name;
|
nor->mtd.name = data->name;
|
||||||
|
@ -24,34 +24,34 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
+
|
+
|
||||||
+ /* store the led values if one was passed by the devicetree */
|
+ /* store the led values if one was passed by the devicetree */
|
||||||
+ if (!of_property_read_u32(phydev->mdio.dev.of_node, "lantiq,ledch", &tmp))
|
+ if (!of_property_read_u32(phydev->mdio.dev.of_node, "lantiq,ledch", &tmp))
|
||||||
+ phy_write_mmd_indirect(phydev, XWAY_MMD_LEDCH, MDIO_MMD_VEND2, tmp);
|
+ phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LEDCH, tmp);
|
||||||
+
|
+
|
||||||
+ if (!of_property_read_u32(phydev->mdio.dev.of_node, "lantiq,ledcl", &tmp))
|
+ if (!of_property_read_u32(phydev->mdio.dev.of_node, "lantiq,ledcl", &tmp))
|
||||||
+ phy_write_mmd_indirect(phydev, XWAY_MMD_LEDCL, MDIO_MMD_VEND2, tmp);
|
+ phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LEDCL, tmp);
|
||||||
+
|
+
|
||||||
+ if (!of_property_read_u32(phydev->mdio.dev.of_node, "lantiq,led0h", &tmp))
|
+ if (!of_property_read_u32(phydev->mdio.dev.of_node, "lantiq,led0h", &tmp))
|
||||||
+ phy_write_mmd_indirect(phydev, XWAY_MMD_LED0H, MDIO_MMD_VEND2, tmp);
|
+ phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED0H, tmp);
|
||||||
+
|
+
|
||||||
+ if (!of_property_read_u32(phydev->mdio.dev.of_node, "lantiq,led0l", &tmp))
|
+ if (!of_property_read_u32(phydev->mdio.dev.of_node, "lantiq,led0l", &tmp))
|
||||||
+ phy_write_mmd_indirect(phydev, XWAY_MMD_LED0L, MDIO_MMD_VEND2, tmp);
|
+ phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED0L, tmp);
|
||||||
+
|
+
|
||||||
+ if (!of_property_read_u32(phydev->mdio.dev.of_node, "lantiq,led1h", &tmp))
|
+ if (!of_property_read_u32(phydev->mdio.dev.of_node, "lantiq,led1h", &tmp))
|
||||||
+ phy_write_mmd_indirect(phydev, XWAY_MMD_LED1H, MDIO_MMD_VEND2, tmp);
|
+ phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED1H, tmp);
|
||||||
+
|
+
|
||||||
+ if (!of_property_read_u32(phydev->mdio.dev.of_node, "lantiq,led1l", &tmp))
|
+ if (!of_property_read_u32(phydev->mdio.dev.of_node, "lantiq,led1l", &tmp))
|
||||||
+ phy_write_mmd_indirect(phydev, XWAY_MMD_LED1L, MDIO_MMD_VEND2, tmp);
|
+ phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED1L, tmp);
|
||||||
+
|
+
|
||||||
+ if (!of_property_read_u32(phydev->mdio.dev.of_node, "lantiq,led2h", &tmp))
|
+ if (!of_property_read_u32(phydev->mdio.dev.of_node, "lantiq,led2h", &tmp))
|
||||||
+ phy_write_mmd_indirect(phydev, XWAY_MMD_LED3H, MDIO_MMD_VEND2, tmp);
|
+ phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED3H, tmp);
|
||||||
+
|
+
|
||||||
+ if (!of_property_read_u32(phydev->mdio.dev.of_node, "lantiq,led2l", &tmp))
|
+ if (!of_property_read_u32(phydev->mdio.dev.of_node, "lantiq,led2l", &tmp))
|
||||||
+ phy_write_mmd_indirect(phydev, XWAY_MMD_LED3L, MDIO_MMD_VEND2, tmp);
|
+ phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED3L, tmp);
|
||||||
+
|
+
|
||||||
+ if (!of_property_read_u32(phydev->mdio.dev.of_node, "lantiq,led3h", &tmp))
|
+ if (!of_property_read_u32(phydev->mdio.dev.of_node, "lantiq,led3h", &tmp))
|
||||||
+ phy_write_mmd_indirect(phydev, XWAY_MMD_LED3H, MDIO_MMD_VEND2, tmp);
|
+ phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED3H, tmp);
|
||||||
+
|
+
|
||||||
+ if (!of_property_read_u32(phydev->mdio.dev.of_node, "lantiq,led3l", &tmp))
|
+ if (!of_property_read_u32(phydev->mdio.dev.of_node, "lantiq,led3l", &tmp))
|
||||||
+ phy_write_mmd_indirect(phydev, XWAY_MMD_LED3L, MDIO_MMD_VEND2, tmp);
|
+ phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED3L, tmp);
|
||||||
+
|
+
|
||||||
+ return 0;
|
+ return 0;
|
||||||
+}
|
+}
|
||||||
@ -66,8 +66,8 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
@@ -190,6 +235,7 @@ static int xway_gphy_config_init(struct
|
@@ -190,6 +235,7 @@ static int xway_gphy_config_init(struct
|
||||||
phy_write_mmd_indirect(phydev, XWAY_MMD_LED2H, MDIO_MMD_VEND2, ledxh);
|
phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED2H, ledxh);
|
||||||
phy_write_mmd_indirect(phydev, XWAY_MMD_LED2L, MDIO_MMD_VEND2, ledxl);
|
phy_write_mmd(phydev, MDIO_MMD_VEND2, XWAY_MMD_LED2L, ledxl);
|
||||||
|
|
||||||
+ vr9_gphy_of_reg_init(phydev);
|
+ vr9_gphy_of_reg_init(phydev);
|
||||||
return 0;
|
return 0;
|
@ -1,364 +0,0 @@
|
|||||||
From 77e89d5a28be35058041c79e9874ab26f222c603 Mon Sep 17 00:00:00 2001
|
|
||||||
From: John Crispin <blogic@openwrt.org>
|
|
||||||
Date: Mon, 22 Oct 2012 09:26:24 +0200
|
|
||||||
Subject: [PATCH 24/36] NET: lantiq: adds PHY11G firmware blobs
|
|
||||||
|
|
||||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
|
||||||
---
|
|
||||||
firmware/Makefile | 4 +
|
|
||||||
firmware/lantiq/COPYING | 286 +++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
firmware/lantiq/README | 45 ++++++++
|
|
||||||
3 files changed, 335 insertions(+)
|
|
||||||
create mode 100644 firmware/lantiq/COPYING
|
|
||||||
create mode 100644 firmware/lantiq/README
|
|
||||||
|
|
||||||
--- a/firmware/Makefile
|
|
||||||
+++ b/firmware/Makefile
|
|
||||||
@@ -134,6 +134,10 @@ fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_P
|
|
||||||
fw-shipped-$(CONFIG_USB_SERIAL_XIRCOM) += keyspan_pda/xircom_pgs.fw
|
|
||||||
fw-shipped-$(CONFIG_USB_VICAM) += vicam/firmware.fw
|
|
||||||
fw-shipped-$(CONFIG_VIDEO_CPIA2) += cpia2/stv0672_vp4.bin
|
|
||||||
+fw-shipped-$(CONFIG_LANTIQ_XRX200) += lantiq/xrx200_phy11g_a14.bin
|
|
||||||
+fw-shipped-$(CONFIG_LANTIQ_XRX200) += lantiq/xrx200_phy11g_a22.bin
|
|
||||||
+fw-shipped-$(CONFIG_LANTIQ_XRX200) += lantiq/xrx200_phy22f_a14.bin
|
|
||||||
+fw-shipped-$(CONFIG_LANTIQ_XRX200) += lantiq/xrx200_phy22f_a22.bin
|
|
||||||
fw-shipped-$(CONFIG_YAM) += yam/1200.bin yam/9600.bin
|
|
||||||
|
|
||||||
fw-shipped-all := $(fw-shipped-y) $(fw-shipped-m) $(fw-shipped-)
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/firmware/lantiq/COPYING
|
|
||||||
@@ -0,0 +1,286 @@
|
|
||||||
+All firmware files are copyrighted by Lantiq Deutschland GmbH.
|
|
||||||
+The files have been extracted from header files found in Lantiq BSPs.
|
|
||||||
+If not stated otherwise all files are licensed under GPL.
|
|
||||||
+
|
|
||||||
+=======================================================================
|
|
||||||
+
|
|
||||||
+ GNU GENERAL PUBLIC LICENSE
|
|
||||||
+ Version 2, June 1991
|
|
||||||
+
|
|
||||||
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
|
||||||
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
+ Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
+ of this license document, but changing it is not allowed.
|
|
||||||
+
|
|
||||||
+ Preamble
|
|
||||||
+
|
|
||||||
+ The licenses for most software are designed to take away your
|
|
||||||
+freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
+License is intended to guarantee your freedom to share and change free
|
|
||||||
+software--to make sure the software is free for all its users. This
|
|
||||||
+General Public License applies to most of the Free Software
|
|
||||||
+Foundation's software and to any other program whose authors commit to
|
|
||||||
+using it. (Some other Free Software Foundation software is covered by
|
|
||||||
+the GNU Library General Public License instead.) You can apply it to
|
|
||||||
+your programs, too.
|
|
||||||
+
|
|
||||||
+ When we speak of free software, we are referring to freedom, not
|
|
||||||
+price. Our General Public Licenses are designed to make sure that you
|
|
||||||
+have the freedom to distribute copies of free software (and charge for
|
|
||||||
+this service if you wish), that you receive source code or can get it
|
|
||||||
+if you want it, that you can change the software or use pieces of it
|
|
||||||
+in new free programs; and that you know you can do these things.
|
|
||||||
+
|
|
||||||
+ To protect your rights, we need to make restrictions that forbid
|
|
||||||
+anyone to deny you these rights or to ask you to surrender the rights.
|
|
||||||
+These restrictions translate to certain responsibilities for you if you
|
|
||||||
+distribute copies of the software, or if you modify it.
|
|
||||||
+
|
|
||||||
+ For example, if you distribute copies of such a program, whether
|
|
||||||
+gratis or for a fee, you must give the recipients all the rights that
|
|
||||||
+you have. You must make sure that they, too, receive or can get the
|
|
||||||
+source code. And you must show them these terms so they know their
|
|
||||||
+rights.
|
|
||||||
+
|
|
||||||
+ We protect your rights with two steps: (1) copyright the software, and
|
|
||||||
+(2) offer you this license which gives you legal permission to copy,
|
|
||||||
+distribute and/or modify the software.
|
|
||||||
+
|
|
||||||
+ Also, for each author's protection and ours, we want to make certain
|
|
||||||
+that everyone understands that there is no warranty for this free
|
|
||||||
+software. If the software is modified by someone else and passed on, we
|
|
||||||
+want its recipients to know that what they have is not the original, so
|
|
||||||
+that any problems introduced by others will not reflect on the original
|
|
||||||
+authors' reputations.
|
|
||||||
+
|
|
||||||
+ Finally, any free program is threatened constantly by software
|
|
||||||
+patents. We wish to avoid the danger that redistributors of a free
|
|
||||||
+program will individually obtain patent licenses, in effect making the
|
|
||||||
+program proprietary. To prevent this, we have made it clear that any
|
|
||||||
+patent must be licensed for everyone's free use or not licensed at all.
|
|
||||||
+
|
|
||||||
+ The precise terms and conditions for copying, distribution and
|
|
||||||
+modification follow.
|
|
||||||
+
|
|
||||||
+ GNU GENERAL PUBLIC LICENSE
|
|
||||||
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
+
|
|
||||||
+ 0. This License applies to any program or other work which contains
|
|
||||||
+a notice placed by the copyright holder saying it may be distributed
|
|
||||||
+under the terms of this General Public License. The "Program", below,
|
|
||||||
+refers to any such program or work, and a "work based on the Program"
|
|
||||||
+means either the Program or any derivative work under copyright law:
|
|
||||||
+that is to say, a work containing the Program or a portion of it,
|
|
||||||
+either verbatim or with modifications and/or translated into another
|
|
||||||
+language. (Hereinafter, translation is included without limitation in
|
|
||||||
+the term "modification".) Each licensee is addressed as "you".
|
|
||||||
+
|
|
||||||
+Activities other than copying, distribution and modification are not
|
|
||||||
+covered by this License; they are outside its scope. The act of
|
|
||||||
+running the Program is not restricted, and the output from the Program
|
|
||||||
+is covered only if its contents constitute a work based on the
|
|
||||||
+Program (independent of having been made by running the Program).
|
|
||||||
+Whether that is true depends on what the Program does.
|
|
||||||
+
|
|
||||||
+ 1. You may copy and distribute verbatim copies of the Program's
|
|
||||||
+source code as you receive it, in any medium, provided that you
|
|
||||||
+conspicuously and appropriately publish on each copy an appropriate
|
|
||||||
+copyright notice and disclaimer of warranty; keep intact all the
|
|
||||||
+notices that refer to this License and to the absence of any warranty;
|
|
||||||
+and give any other recipients of the Program a copy of this License
|
|
||||||
+along with the Program.
|
|
||||||
+
|
|
||||||
+You may charge a fee for the physical act of transferring a copy, and
|
|
||||||
+you may at your option offer warranty protection in exchange for a fee.
|
|
||||||
+
|
|
||||||
+ 2. You may modify your copy or copies of the Program or any portion
|
|
||||||
+of it, thus forming a work based on the Program, and copy and
|
|
||||||
+distribute such modifications or work under the terms of Section 1
|
|
||||||
+above, provided that you also meet all of these conditions:
|
|
||||||
+
|
|
||||||
+ a) You must cause the modified files to carry prominent notices
|
|
||||||
+ stating that you changed the files and the date of any change.
|
|
||||||
+
|
|
||||||
+ b) You must cause any work that you distribute or publish, that in
|
|
||||||
+ whole or in part contains or is derived from the Program or any
|
|
||||||
+ part thereof, to be licensed as a whole at no charge to all third
|
|
||||||
+ parties under the terms of this License.
|
|
||||||
+
|
|
||||||
+ c) If the modified program normally reads commands interactively
|
|
||||||
+ when run, you must cause it, when started running for such
|
|
||||||
+ interactive use in the most ordinary way, to print or display an
|
|
||||||
+ announcement including an appropriate copyright notice and a
|
|
||||||
+ notice that there is no warranty (or else, saying that you provide
|
|
||||||
+ a warranty) and that users may redistribute the program under
|
|
||||||
+ these conditions, and telling the user how to view a copy of this
|
|
||||||
+ License. (Exception: if the Program itself is interactive but
|
|
||||||
+ does not normally print such an announcement, your work based on
|
|
||||||
+ the Program is not required to print an announcement.)
|
|
||||||
+
|
|
||||||
+These requirements apply to the modified work as a whole. If
|
|
||||||
+identifiable sections of that work are not derived from the Program,
|
|
||||||
+and can be reasonably considered independent and separate works in
|
|
||||||
+themselves, then this License, and its terms, do not apply to those
|
|
||||||
+sections when you distribute them as separate works. But when you
|
|
||||||
+distribute the same sections as part of a whole which is a work based
|
|
||||||
+on the Program, the distribution of the whole must be on the terms of
|
|
||||||
+this License, whose permissions for other licensees extend to the
|
|
||||||
+entire whole, and thus to each and every part regardless of who wrote it.
|
|
||||||
+
|
|
||||||
+Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
+your rights to work written entirely by you; rather, the intent is to
|
|
||||||
+exercise the right to control the distribution of derivative or
|
|
||||||
+collective works based on the Program.
|
|
||||||
+
|
|
||||||
+In addition, mere aggregation of another work not based on the Program
|
|
||||||
+with the Program (or with a work based on the Program) on a volume of
|
|
||||||
+a storage or distribution medium does not bring the other work under
|
|
||||||
+the scope of this License.
|
|
||||||
+
|
|
||||||
+ 3. You may copy and distribute the Program (or a work based on it,
|
|
||||||
+under Section 2) in object code or executable form under the terms of
|
|
||||||
+Sections 1 and 2 above provided that you also do one of the following:
|
|
||||||
+
|
|
||||||
+ a) Accompany it with the complete corresponding machine-readable
|
|
||||||
+ source code, which must be distributed under the terms of Sections
|
|
||||||
+ 1 and 2 above on a medium customarily used for software interchange; or,
|
|
||||||
+
|
|
||||||
+ b) Accompany it with a written offer, valid for at least three
|
|
||||||
+ years, to give any third party, for a charge no more than your
|
|
||||||
+ cost of physically performing source distribution, a complete
|
|
||||||
+ machine-readable copy of the corresponding source code, to be
|
|
||||||
+ distributed under the terms of Sections 1 and 2 above on a medium
|
|
||||||
+ customarily used for software interchange; or,
|
|
||||||
+
|
|
||||||
+ c) Accompany it with the information you received as to the offer
|
|
||||||
+ to distribute corresponding source code. (This alternative is
|
|
||||||
+ allowed only for noncommercial distribution and only if you
|
|
||||||
+ received the program in object code or executable form with such
|
|
||||||
+ an offer, in accord with Subsection b above.)
|
|
||||||
+
|
|
||||||
+The source code for a work means the preferred form of the work for
|
|
||||||
+making modifications to it. For an executable work, complete source
|
|
||||||
+code means all the source code for all modules it contains, plus any
|
|
||||||
+associated interface definition files, plus the scripts used to
|
|
||||||
+control compilation and installation of the executable. However, as a
|
|
||||||
+special exception, the source code distributed need not include
|
|
||||||
+anything that is normally distributed (in either source or binary
|
|
||||||
+form) with the major components (compiler, kernel, and so on) of the
|
|
||||||
+operating system on which the executable runs, unless that component
|
|
||||||
+itself accompanies the executable.
|
|
||||||
+
|
|
||||||
+If distribution of executable or object code is made by offering
|
|
||||||
+access to copy from a designated place, then offering equivalent
|
|
||||||
+access to copy the source code from the same place counts as
|
|
||||||
+distribution of the source code, even though third parties are not
|
|
||||||
+compelled to copy the source along with the object code.
|
|
||||||
+
|
|
||||||
+ 4. You may not copy, modify, sublicense, or distribute the Program
|
|
||||||
+except as expressly provided under this License. Any attempt
|
|
||||||
+otherwise to copy, modify, sublicense or distribute the Program is
|
|
||||||
+void, and will automatically terminate your rights under this License.
|
|
||||||
+However, parties who have received copies, or rights, from you under
|
|
||||||
+this License will not have their licenses terminated so long as such
|
|
||||||
+parties remain in full compliance.
|
|
||||||
+
|
|
||||||
+ 5. You are not required to accept this License, since you have not
|
|
||||||
+signed it. However, nothing else grants you permission to modify or
|
|
||||||
+distribute the Program or its derivative works. These actions are
|
|
||||||
+prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
+modifying or distributing the Program (or any work based on the
|
|
||||||
+Program), you indicate your acceptance of this License to do so, and
|
|
||||||
+all its terms and conditions for copying, distributing or modifying
|
|
||||||
+the Program or works based on it.
|
|
||||||
+
|
|
||||||
+ 6. Each time you redistribute the Program (or any work based on the
|
|
||||||
+Program), the recipient automatically receives a license from the
|
|
||||||
+original licensor to copy, distribute or modify the Program subject to
|
|
||||||
+these terms and conditions. You may not impose any further
|
|
||||||
+restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
+You are not responsible for enforcing compliance by third parties to
|
|
||||||
+this License.
|
|
||||||
+
|
|
||||||
+ 7. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
+infringement or for any other reason (not limited to patent issues),
|
|
||||||
+conditions are imposed on you (whether by court order, agreement or
|
|
||||||
+otherwise) that contradict the conditions of this License, they do not
|
|
||||||
+excuse you from the conditions of this License. If you cannot
|
|
||||||
+distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
+License and any other pertinent obligations, then as a consequence you
|
|
||||||
+may not distribute the Program at all. For example, if a patent
|
|
||||||
+license would not permit royalty-free redistribution of the Program by
|
|
||||||
+all those who receive copies directly or indirectly through you, then
|
|
||||||
+the only way you could satisfy both it and this License would be to
|
|
||||||
+refrain entirely from distribution of the Program.
|
|
||||||
+
|
|
||||||
+If any portion of this section is held invalid or unenforceable under
|
|
||||||
+any particular circumstance, the balance of the section is intended to
|
|
||||||
+apply and the section as a whole is intended to apply in other
|
|
||||||
+circumstances.
|
|
||||||
+
|
|
||||||
+It is not the purpose of this section to induce you to infringe any
|
|
||||||
+patents or other property right claims or to contest validity of any
|
|
||||||
+such claims; this section has the sole purpose of protecting the
|
|
||||||
+integrity of the free software distribution system, which is
|
|
||||||
+implemented by public license practices. Many people have made
|
|
||||||
+generous contributions to the wide range of software distributed
|
|
||||||
+through that system in reliance on consistent application of that
|
|
||||||
+system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
+to distribute software through any other system and a licensee cannot
|
|
||||||
+impose that choice.
|
|
||||||
+
|
|
||||||
+This section is intended to make thoroughly clear what is believed to
|
|
||||||
+be a consequence of the rest of this License.
|
|
||||||
+
|
|
||||||
+ 8. If the distribution and/or use of the Program is restricted in
|
|
||||||
+certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
+original copyright holder who places the Program under this License
|
|
||||||
+may add an explicit geographical distribution limitation excluding
|
|
||||||
+those countries, so that distribution is permitted only in or among
|
|
||||||
+countries not thus excluded. In such case, this License incorporates
|
|
||||||
+the limitation as if written in the body of this License.
|
|
||||||
+
|
|
||||||
+ 9. The Free Software Foundation may publish revised and/or new versions
|
|
||||||
+of the General Public License from time to time. Such new versions will
|
|
||||||
+be similar in spirit to the present version, but may differ in detail to
|
|
||||||
+address new problems or concerns.
|
|
||||||
+
|
|
||||||
+Each version is given a distinguishing version number. If the Program
|
|
||||||
+specifies a version number of this License which applies to it and "any
|
|
||||||
+later version", you have the option of following the terms and conditions
|
|
||||||
+either of that version or of any later version published by the Free
|
|
||||||
+Software Foundation. If the Program does not specify a version number of
|
|
||||||
+this License, you may choose any version ever published by the Free Software
|
|
||||||
+Foundation.
|
|
||||||
+
|
|
||||||
+ 10. If you wish to incorporate parts of the Program into other free
|
|
||||||
+programs whose distribution conditions are different, write to the author
|
|
||||||
+to ask for permission. For software which is copyrighted by the Free
|
|
||||||
+Software Foundation, write to the Free Software Foundation; we sometimes
|
|
||||||
+make exceptions for this. Our decision will be guided by the two goals
|
|
||||||
+of preserving the free status of all derivatives of our free software and
|
|
||||||
+of promoting the sharing and reuse of software generally.
|
|
||||||
+
|
|
||||||
+ NO WARRANTY
|
|
||||||
+
|
|
||||||
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
|
||||||
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
|
||||||
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
|
||||||
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
|
||||||
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
|
||||||
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
|
||||||
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
|
||||||
+REPAIR OR CORRECTION.
|
|
||||||
+
|
|
||||||
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
|
||||||
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
|
||||||
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
|
||||||
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
|
||||||
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
|
||||||
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|
||||||
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|
||||||
+POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
+
|
|
||||||
+ END OF TERMS AND CONDITIONS
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/firmware/lantiq/README
|
|
||||||
@@ -0,0 +1,45 @@
|
|
||||||
+#
|
|
||||||
+# This program is free software; you can redistribute it and/or
|
|
||||||
+# modify it under the terms of the GNU General Public License as
|
|
||||||
+# published by the Free Software Foundation; either version 2 of
|
|
||||||
+# the License, or (at your option) any later version.
|
|
||||||
+#
|
|
||||||
+# This program is distributed in the hope that it will be useful,
|
|
||||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
+# GNU General Public License for more details.
|
|
||||||
+#
|
|
||||||
+# You should have received a copy of the GNU General Public License
|
|
||||||
+# along with this program; if not, write to the Free Software
|
|
||||||
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
||||||
+# MA 02111-1307 USA
|
|
||||||
+#
|
|
||||||
+# (C) Copyright 2007 - 2012
|
|
||||||
+# Lantiq Deutschland GmbH
|
|
||||||
+#
|
|
||||||
+# (C) Copyright 2012
|
|
||||||
+# Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
|
|
||||||
+#
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# How to use
|
|
||||||
+#
|
|
||||||
+Configure kernel with:
|
|
||||||
+CONFIG_FW_LOADER=y
|
|
||||||
+CONFIG_EXTRA_FIRMWARE_DIR="FIRMWARE_DIR"
|
|
||||||
+CONFIG_EXTRA_FIRMWARE="FIRMWARE_FILES"
|
|
||||||
+
|
|
||||||
+where FIRMWARE_DIR should point to this git tree and FIRMWARE_FILES is a list
|
|
||||||
+of space separated files from list below.
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# Firmware files
|
|
||||||
+#
|
|
||||||
+
|
|
||||||
+# GPHY core on Lantiq XWAY VR9 v1.1
|
|
||||||
+lantiq/xrx200_phy11g_a14.bin
|
|
||||||
+lantiq/xrx200_phy22f_a14.bin
|
|
||||||
+
|
|
||||||
+# GPHY core on Lantiq XWAY VR9 v1.2
|
|
||||||
+lantiq/xrx200_phy11g_a22.bin
|
|
||||||
+lantiq/xrx200_phy22f_a22.bin
|
|
@ -16,7 +16,7 @@ Subject: [PATCH 25/36] NET: MIPS: lantiq: adds xrx200-net
|
|||||||
|
|
||||||
--- a/drivers/net/ethernet/Kconfig
|
--- a/drivers/net/ethernet/Kconfig
|
||||||
+++ b/drivers/net/ethernet/Kconfig
|
+++ b/drivers/net/ethernet/Kconfig
|
||||||
@@ -104,7 +104,13 @@ config LANTIQ_ETOP
|
@@ -107,7 +107,13 @@ config LANTIQ_ETOP
|
||||||
tristate "Lantiq SoC ETOP driver"
|
tristate "Lantiq SoC ETOP driver"
|
||||||
depends on SOC_TYPE_XWAY
|
depends on SOC_TYPE_XWAY
|
||||||
---help---
|
---help---
|
||||||
@ -33,7 +33,7 @@ Subject: [PATCH 25/36] NET: MIPS: lantiq: adds xrx200-net
|
|||||||
source "drivers/net/ethernet/mediatek/Kconfig"
|
source "drivers/net/ethernet/mediatek/Kconfig"
|
||||||
--- a/drivers/net/ethernet/Makefile
|
--- a/drivers/net/ethernet/Makefile
|
||||||
+++ b/drivers/net/ethernet/Makefile
|
+++ b/drivers/net/ethernet/Makefile
|
||||||
@@ -46,6 +46,7 @@ obj-$(CONFIG_NET_VENDOR_XSCALE) += xscal
|
@@ -50,6 +50,7 @@ obj-$(CONFIG_NET_VENDOR_XSCALE) += xscal
|
||||||
obj-$(CONFIG_JME) += jme.o
|
obj-$(CONFIG_JME) += jme.o
|
||||||
obj-$(CONFIG_KORINA) += korina.o
|
obj-$(CONFIG_KORINA) += korina.o
|
||||||
obj-$(CONFIG_LANTIQ_ETOP) += lantiq_etop.o
|
obj-$(CONFIG_LANTIQ_ETOP) += lantiq_etop.o
|
||||||
@ -209,7 +209,7 @@ Subject: [PATCH 25/36] NET: MIPS: lantiq: adds xrx200-net
|
|||||||
+};
|
+};
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/drivers/net/ethernet/lantiq_xrx200.c
|
+++ b/drivers/net/ethernet/lantiq_xrx200.c
|
||||||
@@ -0,0 +1,1851 @@
|
@@ -0,0 +1,1887 @@
|
||||||
+/*
|
+/*
|
||||||
+ * This program is free software; you can redistribute it and/or modify it
|
+ * This program is free software; you can redistribute it and/or modify it
|
||||||
+ * under the terms of the GNU General Public License version 2 as published
|
+ * under the terms of the GNU General Public License version 2 as published
|
||||||
@ -240,6 +240,7 @@ Subject: [PATCH 25/36] NET: MIPS: lantiq: adds xrx200-net
|
|||||||
+#include <linux/of_net.h>
|
+#include <linux/of_net.h>
|
||||||
+#include <linux/of_mdio.h>
|
+#include <linux/of_mdio.h>
|
||||||
+#include <linux/of_gpio.h>
|
+#include <linux/of_gpio.h>
|
||||||
|
+#include <linux/of_platform.h>
|
||||||
+
|
+
|
||||||
+#include <xway_dma.h>
|
+#include <xway_dma.h>
|
||||||
+#include <lantiq_soc.h>
|
+#include <lantiq_soc.h>
|
||||||
@ -1460,16 +1461,12 @@ Subject: [PATCH 25/36] NET: MIPS: lantiq: adds xrx200-net
|
|||||||
+static void xrx200_mdio_link(struct net_device *dev)
|
+static void xrx200_mdio_link(struct net_device *dev)
|
||||||
+{
|
+{
|
||||||
+ struct xrx200_priv *priv = netdev_priv(dev);
|
+ struct xrx200_priv *priv = netdev_priv(dev);
|
||||||
+ bool link = false;
|
|
||||||
+ int i;
|
+ int i;
|
||||||
+
|
+
|
||||||
+ for (i = 0; i < priv->num_port; i++) {
|
+ for (i = 0; i < priv->num_port; i++) {
|
||||||
+ if (!priv->port[i].phydev)
|
+ if (!priv->port[i].phydev)
|
||||||
+ continue;
|
+ continue;
|
||||||
+
|
+
|
||||||
+ if (priv->port[i].phydev->link)
|
|
||||||
+ link = true;
|
|
||||||
+
|
|
||||||
+ if (priv->port[i].link != priv->port[i].phydev->link) {
|
+ if (priv->port[i].link != priv->port[i].phydev->link) {
|
||||||
+ xrx200_gmac_update(&priv->port[i]);
|
+ xrx200_gmac_update(&priv->port[i]);
|
||||||
+ priv->port[i].link = priv->port[i].phydev->link;
|
+ priv->port[i].link = priv->port[i].phydev->link;
|
||||||
@ -1478,8 +1475,6 @@ Subject: [PATCH 25/36] NET: MIPS: lantiq: adds xrx200-net
|
|||||||
+ (priv->port[i].link)?("got"):("lost"));
|
+ (priv->port[i].link)?("got"):("lost"));
|
||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
+ if (netif_carrier_ok(dev) && !link)
|
|
||||||
+ netif_carrier_off(dev);
|
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+static inline int xrx200_mdio_poll(struct mii_bus *bus)
|
+static inline int xrx200_mdio_poll(struct mii_bus *bus)
|
||||||
@ -1525,6 +1520,35 @@ Subject: [PATCH 25/36] NET: MIPS: lantiq: adds xrx200-net
|
|||||||
+ return ltq_mdio_r32(MDIO_READ);
|
+ return ltq_mdio_r32(MDIO_READ);
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
|
+static int xrx200_phy_has_link(struct net_device *dev)
|
||||||
|
+{
|
||||||
|
+ struct xrx200_priv *priv = netdev_priv(dev);
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < priv->num_port; i++) {
|
||||||
|
+ if (!priv->port[i].phydev)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ if (priv->port[i].phydev->link)
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void xrx200_phy_link_change(struct phy_device *phydev, bool up, bool do_carrier)
|
||||||
|
+{
|
||||||
|
+ struct net_device *netdev = phydev->attached_dev;
|
||||||
|
+
|
||||||
|
+ if (do_carrier)
|
||||||
|
+ if (up)
|
||||||
|
+ netif_carrier_on(netdev);
|
||||||
|
+ else if (!xrx200_phy_has_link(netdev))
|
||||||
|
+ netif_carrier_off(netdev);
|
||||||
|
+
|
||||||
|
+ phydev->adjust_link(netdev);
|
||||||
|
+}
|
||||||
|
+
|
||||||
+static int xrx200_mdio_probe(struct net_device *dev, struct xrx200_port *port)
|
+static int xrx200_mdio_probe(struct net_device *dev, struct xrx200_port *port)
|
||||||
+{
|
+{
|
||||||
+ struct xrx200_priv *priv = netdev_priv(dev);
|
+ struct xrx200_priv *priv = netdev_priv(dev);
|
||||||
@ -1557,7 +1581,7 @@ Subject: [PATCH 25/36] NET: MIPS: lantiq: adds xrx200-net
|
|||||||
+ | SUPPORTED_TP);
|
+ | SUPPORTED_TP);
|
||||||
+ phydev->advertising = phydev->supported;
|
+ phydev->advertising = phydev->supported;
|
||||||
+ port->phydev = phydev;
|
+ port->phydev = phydev;
|
||||||
+ phydev->no_auto_carrier_off = true;
|
+ phydev->phy_link_change = xrx200_phy_link_change;
|
||||||
+
|
+
|
||||||
+ phy_attached_info(phydev);
|
+ phy_attached_info(phydev);
|
||||||
+
|
+
|
||||||
@ -1880,7 +1904,6 @@ Subject: [PATCH 25/36] NET: MIPS: lantiq: adds xrx200-net
|
|||||||
+ .ndo_start_xmit = xrx200_start_xmit,
|
+ .ndo_start_xmit = xrx200_start_xmit,
|
||||||
+ .ndo_set_mac_address = eth_mac_addr,
|
+ .ndo_set_mac_address = eth_mac_addr,
|
||||||
+ .ndo_validate_addr = eth_validate_addr,
|
+ .ndo_validate_addr = eth_validate_addr,
|
||||||
+ .ndo_change_mtu = eth_change_mtu,
|
|
||||||
+ .ndo_get_stats = xrx200_get_stats,
|
+ .ndo_get_stats = xrx200_get_stats,
|
||||||
+ .ndo_tx_timeout = xrx200_tx_timeout,
|
+ .ndo_tx_timeout = xrx200_tx_timeout,
|
||||||
+};
|
+};
|
||||||
@ -1937,7 +1960,9 @@ Subject: [PATCH 25/36] NET: MIPS: lantiq: adds xrx200-net
|
|||||||
+static int xrx200_probe(struct platform_device *pdev)
|
+static int xrx200_probe(struct platform_device *pdev)
|
||||||
+{
|
+{
|
||||||
+ struct resource *res[4];
|
+ struct resource *res[4];
|
||||||
+ struct device_node *mdio_np, *iface_np;
|
+ struct device_node *mdio_np, *iface_np, *phy_np;
|
||||||
|
+ struct of_phandle_iterator it;
|
||||||
|
+ int err;
|
||||||
+ int i;
|
+ int i;
|
||||||
+
|
+
|
||||||
+ /* load the memory ranges */
|
+ /* load the memory ranges */
|
||||||
@ -1958,6 +1983,17 @@ Subject: [PATCH 25/36] NET: MIPS: lantiq: adds xrx200-net
|
|||||||
+ return -ENOMEM;
|
+ return -ENOMEM;
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
|
+ of_for_each_phandle(&it, err, pdev->dev.of_node, "lantiq,phys", NULL, 0) {
|
||||||
|
+ phy_np = it.node;
|
||||||
|
+ if (phy_np) {
|
||||||
|
+ struct platform_device *phy = of_find_device_by_node(phy_np);
|
||||||
|
+
|
||||||
|
+ of_node_put(phy_np);
|
||||||
|
+ if (!platform_get_drvdata(phy))
|
||||||
|
+ return -EPROBE_DEFER;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
+ /* get the clock */
|
+ /* get the clock */
|
||||||
+ xrx200_hw.clk = clk_get(&pdev->dev, NULL);
|
+ xrx200_hw.clk = clk_get(&pdev->dev, NULL);
|
||||||
+ if (IS_ERR(xrx200_hw.clk)) {
|
+ if (IS_ERR(xrx200_hw.clk)) {
|
||||||
|
@ -1,53 +0,0 @@
|
|||||||
From c6feeeb407a3b8a6597ae377ba4dd138e185e3dd Mon Sep 17 00:00:00 2001
|
|
||||||
From: John Crispin <blogic@openwrt.org>
|
|
||||||
Date: Sun, 27 Jul 2014 09:38:50 +0100
|
|
||||||
Subject: [PATCH 26/36] NET: multi phy support
|
|
||||||
|
|
||||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
|
||||||
---
|
|
||||||
drivers/net/phy/phy.c | 9 ++++++---
|
|
||||||
include/linux/phy.h | 1 +
|
|
||||||
2 files changed, 7 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
--- a/drivers/net/phy/phy.c
|
|
||||||
+++ b/drivers/net/phy/phy.c
|
|
||||||
@@ -1032,7 +1032,8 @@ void phy_state_machine(struct work_struc
|
|
||||||
/* If the link is down, give up on negotiation for now */
|
|
||||||
if (!phydev->link) {
|
|
||||||
phydev->state = PHY_NOLINK;
|
|
||||||
- netif_carrier_off(phydev->attached_dev);
|
|
||||||
+ if (!phydev->no_auto_carrier_off)
|
|
||||||
+ netif_carrier_off(phydev->attached_dev);
|
|
||||||
phydev->adjust_link(phydev->attached_dev);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
@@ -1124,7 +1125,8 @@ void phy_state_machine(struct work_struc
|
|
||||||
netif_carrier_on(phydev->attached_dev);
|
|
||||||
} else {
|
|
||||||
phydev->state = PHY_NOLINK;
|
|
||||||
- netif_carrier_off(phydev->attached_dev);
|
|
||||||
+ if (!phydev->no_auto_carrier_off)
|
|
||||||
+ netif_carrier_off(phydev->attached_dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
phydev->adjust_link(phydev->attached_dev);
|
|
||||||
@@ -1136,7 +1138,8 @@ void phy_state_machine(struct work_struc
|
|
||||||
case PHY_HALTED:
|
|
||||||
if (phydev->link) {
|
|
||||||
phydev->link = 0;
|
|
||||||
- netif_carrier_off(phydev->attached_dev);
|
|
||||||
+ if (!phydev->no_auto_carrier_off)
|
|
||||||
+ netif_carrier_off(phydev->attached_dev);
|
|
||||||
phydev->adjust_link(phydev->attached_dev);
|
|
||||||
do_suspend = true;
|
|
||||||
}
|
|
||||||
--- a/include/linux/phy.h
|
|
||||||
+++ b/include/linux/phy.h
|
|
||||||
@@ -369,6 +369,7 @@ struct phy_device {
|
|
||||||
bool is_pseudo_fixed_link;
|
|
||||||
bool has_fixups;
|
|
||||||
bool suspended;
|
|
||||||
+ bool no_auto_carrier_off;
|
|
||||||
|
|
||||||
enum phy_state state;
|
|
||||||
|
|
@ -328,10 +328,11 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
struct ltq_etop_priv *priv = netdev_priv(dev);
|
struct ltq_etop_priv *priv = netdev_priv(dev);
|
||||||
- int i;
|
- int i;
|
||||||
+ int mii_mode = priv->mii_mode;
|
+ int mii_mode = priv->mii_mode;
|
||||||
+
|
|
||||||
+ clk_enable(priv->clk_ppe);
|
|
||||||
|
|
||||||
- ltq_pmu_enable(PMU_PPE);
|
- ltq_pmu_enable(PMU_PPE);
|
||||||
|
+ clk_enable(priv->clk_ppe);
|
||||||
|
|
||||||
|
- switch (priv->pldata->mii_mode) {
|
||||||
+ if (of_machine_is_compatible("lantiq,ar9")) {
|
+ if (of_machine_is_compatible("lantiq,ar9")) {
|
||||||
+ ltq_etop_gbit_init(dev);
|
+ ltq_etop_gbit_init(dev);
|
||||||
+ /* force the etops link to the gbit to MII */
|
+ /* force the etops link to the gbit to MII */
|
||||||
@ -340,8 +341,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
+ ltq_etop_w32_mask(MDIO_CFG_MASK, 0, LTQ_ETOP_MDIO_CFG);
|
+ ltq_etop_w32_mask(MDIO_CFG_MASK, 0, LTQ_ETOP_MDIO_CFG);
|
||||||
+ ltq_etop_w32_mask(MAC_CFG_MASK, MAC_CFG_CGEN | MAC_CFG_DUPLEX |
|
+ ltq_etop_w32_mask(MAC_CFG_MASK, MAC_CFG_CGEN | MAC_CFG_DUPLEX |
|
||||||
+ MAC_CFG_SPEED | MAC_CFG_LINK, LTQ_ETOP_MAC_CFG);
|
+ MAC_CFG_SPEED | MAC_CFG_LINK, LTQ_ETOP_MAC_CFG);
|
||||||
|
+
|
||||||
- switch (priv->pldata->mii_mode) {
|
|
||||||
+ switch (mii_mode) {
|
+ switch (mii_mode) {
|
||||||
case PHY_INTERFACE_MODE_RMII:
|
case PHY_INTERFACE_MODE_RMII:
|
||||||
- ltq_etop_w32_mask(ETOP_MII_MASK,
|
- ltq_etop_w32_mask(ETOP_MII_MASK,
|
||||||
@ -440,19 +440,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -303,7 +448,10 @@ ltq_etop_get_drvinfo(struct net_device *
|
@@ -308,6 +453,39 @@ static const struct ethtool_ops ltq_etop
|
||||||
static int
|
|
||||||
ltq_etop_nway_reset(struct net_device *dev)
|
|
||||||
{
|
|
||||||
- return phy_start_aneg(dev->phydev);
|
|
||||||
+ if (dev->phydev)
|
|
||||||
+ return phy_start_aneg(dev->phydev);
|
|
||||||
+ else
|
|
||||||
+ return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct ethtool_ops ltq_etop_ethtool_ops = {
|
|
||||||
@@ -314,6 +462,39 @@ static const struct ethtool_ops ltq_etop
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -492,7 +480,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
ltq_etop_mdio_wr(struct mii_bus *bus, int phy_addr, int phy_reg, u16 phy_data)
|
ltq_etop_mdio_wr(struct mii_bus *bus, int phy_addr, int phy_reg, u16 phy_data)
|
||||||
{
|
{
|
||||||
u32 val = MDIO_REQUEST |
|
u32 val = MDIO_REQUEST |
|
||||||
@@ -321,9 +502,9 @@ ltq_etop_mdio_wr(struct mii_bus *bus, in
|
@@ -315,9 +493,9 @@ ltq_etop_mdio_wr(struct mii_bus *bus, in
|
||||||
((phy_reg & MDIO_REG_MASK) << MDIO_REG_OFFSET) |
|
((phy_reg & MDIO_REG_MASK) << MDIO_REG_OFFSET) |
|
||||||
phy_data;
|
phy_data;
|
||||||
|
|
||||||
@ -504,7 +492,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -334,12 +515,12 @@ ltq_etop_mdio_rd(struct mii_bus *bus, in
|
@@ -328,12 +506,12 @@ ltq_etop_mdio_rd(struct mii_bus *bus, in
|
||||||
((phy_addr & MDIO_ADDR_MASK) << MDIO_ADDR_OFFSET) |
|
((phy_addr & MDIO_ADDR_MASK) << MDIO_ADDR_OFFSET) |
|
||||||
((phy_reg & MDIO_REG_MASK) << MDIO_REG_OFFSET);
|
((phy_reg & MDIO_REG_MASK) << MDIO_REG_OFFSET);
|
||||||
|
|
||||||
@ -521,7 +509,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -354,8 +535,18 @@ ltq_etop_mdio_probe(struct net_device *d
|
@@ -348,8 +526,18 @@ ltq_etop_mdio_probe(struct net_device *d
|
||||||
{
|
{
|
||||||
struct ltq_etop_priv *priv = netdev_priv(dev);
|
struct ltq_etop_priv *priv = netdev_priv(dev);
|
||||||
struct phy_device *phydev;
|
struct phy_device *phydev;
|
||||||
@ -541,7 +529,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
|
|
||||||
if (!phydev) {
|
if (!phydev) {
|
||||||
netdev_err(dev, "no PHY found\n");
|
netdev_err(dev, "no PHY found\n");
|
||||||
@@ -363,21 +554,18 @@ ltq_etop_mdio_probe(struct net_device *d
|
@@ -357,21 +545,18 @@ ltq_etop_mdio_probe(struct net_device *d
|
||||||
}
|
}
|
||||||
|
|
||||||
phydev = phy_connect(dev, phydev_name(phydev),
|
phydev = phy_connect(dev, phydev_name(phydev),
|
||||||
@ -568,7 +556,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
phydev->advertising = phydev->supported;
|
phydev->advertising = phydev->supported;
|
||||||
phy_attached_info(phydev);
|
phy_attached_info(phydev);
|
||||||
|
|
||||||
@@ -398,8 +586,13 @@ ltq_etop_mdio_init(struct net_device *de
|
@@ -392,8 +577,13 @@ ltq_etop_mdio_init(struct net_device *de
|
||||||
}
|
}
|
||||||
|
|
||||||
priv->mii_bus->priv = dev;
|
priv->mii_bus->priv = dev;
|
||||||
@ -584,7 +572,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
priv->mii_bus->name = "ltq_mii";
|
priv->mii_bus->name = "ltq_mii";
|
||||||
snprintf(priv->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x",
|
snprintf(priv->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x",
|
||||||
priv->pdev->name, priv->pdev->id);
|
priv->pdev->name, priv->pdev->id);
|
||||||
@@ -436,17 +629,19 @@ static int
|
@@ -430,17 +620,19 @@ static int
|
||||||
ltq_etop_open(struct net_device *dev)
|
ltq_etop_open(struct net_device *dev)
|
||||||
{
|
{
|
||||||
struct ltq_etop_priv *priv = netdev_priv(dev);
|
struct ltq_etop_priv *priv = netdev_priv(dev);
|
||||||
@ -613,7 +601,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
netif_tx_start_all_queues(dev);
|
netif_tx_start_all_queues(dev);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -455,18 +650,19 @@ static int
|
@@ -449,18 +641,19 @@ static int
|
||||||
ltq_etop_stop(struct net_device *dev)
|
ltq_etop_stop(struct net_device *dev)
|
||||||
{
|
{
|
||||||
struct ltq_etop_priv *priv = netdev_priv(dev);
|
struct ltq_etop_priv *priv = netdev_priv(dev);
|
||||||
@ -643,7 +631,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -476,16 +672,16 @@ ltq_etop_tx(struct sk_buff *skb, struct
|
@@ -470,16 +663,16 @@ ltq_etop_tx(struct sk_buff *skb, struct
|
||||||
int queue = skb_get_queue_mapping(skb);
|
int queue = skb_get_queue_mapping(skb);
|
||||||
struct netdev_queue *txq = netdev_get_tx_queue(dev, queue);
|
struct netdev_queue *txq = netdev_get_tx_queue(dev, queue);
|
||||||
struct ltq_etop_priv *priv = netdev_priv(dev);
|
struct ltq_etop_priv *priv = netdev_priv(dev);
|
||||||
@ -665,7 +653,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
netdev_err(dev, "tx ring full\n");
|
netdev_err(dev, "tx ring full\n");
|
||||||
netif_tx_stop_queue(txq);
|
netif_tx_stop_queue(txq);
|
||||||
return NETDEV_TX_BUSY;
|
return NETDEV_TX_BUSY;
|
||||||
@@ -493,7 +689,7 @@ ltq_etop_tx(struct sk_buff *skb, struct
|
@@ -487,7 +680,7 @@ ltq_etop_tx(struct sk_buff *skb, struct
|
||||||
|
|
||||||
/* dma needs to start on a 16 byte aligned address */
|
/* dma needs to start on a 16 byte aligned address */
|
||||||
byte_offset = CPHYSADDR(skb->data) % 16;
|
byte_offset = CPHYSADDR(skb->data) % 16;
|
||||||
@ -674,7 +662,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
|
|
||||||
netif_trans_update(dev);
|
netif_trans_update(dev);
|
||||||
|
|
||||||
@@ -503,11 +699,11 @@ ltq_etop_tx(struct sk_buff *skb, struct
|
@@ -497,11 +690,11 @@ ltq_etop_tx(struct sk_buff *skb, struct
|
||||||
wmb();
|
wmb();
|
||||||
desc->ctl = LTQ_DMA_OWN | LTQ_DMA_SOP | LTQ_DMA_EOP |
|
desc->ctl = LTQ_DMA_OWN | LTQ_DMA_SOP | LTQ_DMA_EOP |
|
||||||
LTQ_DMA_TX_OFFSET(byte_offset) | (len & LTQ_DMA_SIZE_MASK);
|
LTQ_DMA_TX_OFFSET(byte_offset) | (len & LTQ_DMA_SIZE_MASK);
|
||||||
@ -689,19 +677,19 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
netif_tx_stop_queue(txq);
|
netif_tx_stop_queue(txq);
|
||||||
|
|
||||||
return NETDEV_TX_OK;
|
return NETDEV_TX_OK;
|
||||||
@@ -522,8 +718,10 @@ ltq_etop_change_mtu(struct net_device *d
|
@@ -515,8 +708,10 @@ ltq_etop_change_mtu(struct net_device *d
|
||||||
struct ltq_etop_priv *priv = netdev_priv(dev);
|
|
||||||
unsigned long flags;
|
dev->mtu = new_mtu;
|
||||||
|
|
||||||
+ int max = ETH_HLEN + VLAN_HLEN + new_mtu + ETH_FCS_LEN;
|
+ int max = ETH_HLEN + VLAN_HLEN + new_mtu + ETH_FCS_LEN;
|
||||||
+
|
+
|
||||||
spin_lock_irqsave(&priv->lock, flags);
|
spin_lock_irqsave(&priv->lock, flags);
|
||||||
- ltq_etop_w32((ETOP_PLEN_UNDER << 16) | new_mtu,
|
- ltq_etop_w32((ETOP_PLEN_UNDER << 16) | new_mtu, LTQ_ETOP_IGPLEN);
|
||||||
+ ltq_etop_w32((ETOP_PLEN_UNDER << 16) | max,
|
+ ltq_etop_w32((ETOP_PLEN_UNDER << 16) | max, LTQ_ETOP_IGPLEN);
|
||||||
LTQ_ETOP_IGPLEN);
|
|
||||||
spin_unlock_irqrestore(&priv->lock, flags);
|
spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
}
|
|
||||||
@@ -592,6 +790,9 @@ ltq_etop_init(struct net_device *dev)
|
return 0;
|
||||||
|
@@ -584,6 +779,9 @@ ltq_etop_init(struct net_device *dev)
|
||||||
if (err)
|
if (err)
|
||||||
goto err_hw;
|
goto err_hw;
|
||||||
ltq_etop_change_mtu(dev, 1500);
|
ltq_etop_change_mtu(dev, 1500);
|
||||||
@ -711,7 +699,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
|
|
||||||
memcpy(&mac, &priv->pldata->mac, sizeof(struct sockaddr));
|
memcpy(&mac, &priv->pldata->mac, sizeof(struct sockaddr));
|
||||||
if (!is_valid_ether_addr(mac.sa_data)) {
|
if (!is_valid_ether_addr(mac.sa_data)) {
|
||||||
@@ -609,9 +810,10 @@ ltq_etop_init(struct net_device *dev)
|
@@ -601,9 +799,10 @@ ltq_etop_init(struct net_device *dev)
|
||||||
dev->addr_assign_type = NET_ADDR_RANDOM;
|
dev->addr_assign_type = NET_ADDR_RANDOM;
|
||||||
|
|
||||||
ltq_etop_set_multicast_list(dev);
|
ltq_etop_set_multicast_list(dev);
|
||||||
@ -725,7 +713,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_netdev:
|
err_netdev:
|
||||||
@@ -631,6 +833,9 @@ ltq_etop_tx_timeout(struct net_device *d
|
@@ -623,6 +822,9 @@ ltq_etop_tx_timeout(struct net_device *d
|
||||||
err = ltq_etop_hw_init(dev);
|
err = ltq_etop_hw_init(dev);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_hw;
|
goto err_hw;
|
||||||
@ -735,7 +723,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
netif_trans_update(dev);
|
netif_trans_update(dev);
|
||||||
netif_wake_queue(dev);
|
netif_wake_queue(dev);
|
||||||
return;
|
return;
|
||||||
@@ -654,14 +859,19 @@ static const struct net_device_ops ltq_e
|
@@ -646,14 +848,19 @@ static const struct net_device_ops ltq_e
|
||||||
.ndo_tx_timeout = ltq_etop_tx_timeout,
|
.ndo_tx_timeout = ltq_etop_tx_timeout,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -759,7 +747,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
|
|
||||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
if (!res) {
|
if (!res) {
|
||||||
@@ -687,31 +897,62 @@ ltq_etop_probe(struct platform_device *p
|
@@ -679,31 +886,62 @@ ltq_etop_probe(struct platform_device *p
|
||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -837,7 +825,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
|
|
||||||
err = register_netdev(dev);
|
err = register_netdev(dev);
|
||||||
if (err)
|
if (err)
|
||||||
@@ -740,31 +981,22 @@ ltq_etop_remove(struct platform_device *
|
@@ -732,31 +970,22 @@ ltq_etop_remove(struct platform_device *
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
|
|
||||||
#include "gpiolib.h"
|
#include "gpiolib.h"
|
||||||
|
|
||||||
@@ -538,3 +540,73 @@ void of_gpiochip_remove(struct gpio_chip
|
@@ -506,3 +508,73 @@ void of_gpiochip_remove(struct gpio_chip
|
||||||
gpiochip_remove_pin_ranges(chip);
|
gpiochip_remove_pin_ranges(chip);
|
||||||
of_node_put(chip->of_node);
|
of_node_put(chip->of_node);
|
||||||
}
|
}
|
||||||
@ -98,7 +98,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
+#endif
|
+#endif
|
||||||
--- a/include/asm-generic/gpio.h
|
--- a/include/asm-generic/gpio.h
|
||||||
+++ b/include/asm-generic/gpio.h
|
+++ b/include/asm-generic/gpio.h
|
||||||
@@ -126,6 +126,12 @@ static inline int gpio_export(unsigned g
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,7 +113,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
{
|
{
|
||||||
--- a/include/linux/gpio/consumer.h
|
--- a/include/linux/gpio/consumer.h
|
||||||
+++ b/include/linux/gpio/consumer.h
|
+++ b/include/linux/gpio/consumer.h
|
||||||
@@ -427,6 +427,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)
|
#if IS_ENABLED(CONFIG_GPIOLIB) && IS_ENABLED(CONFIG_GPIO_SYSFS)
|
||||||
|
|
||||||
@ -121,7 +121,7 @@ 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);
|
||||||
int gpiod_export_link(struct device *dev, const char *name,
|
int gpiod_export_link(struct device *dev, const char *name,
|
||||||
struct gpio_desc *desc);
|
struct gpio_desc *desc);
|
||||||
@@ -434,6 +435,13 @@ void gpiod_unexport(struct gpio_desc *de
|
@@ -458,6 +459,13 @@ void gpiod_unexport(struct gpio_desc *de
|
||||||
|
|
||||||
#else /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */
|
#else /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */
|
||||||
|
|
||||||
@ -137,7 +137,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
{
|
{
|
||||||
--- a/drivers/gpio/gpiolib-sysfs.c
|
--- a/drivers/gpio/gpiolib-sysfs.c
|
||||||
+++ b/drivers/gpio/gpiolib-sysfs.c
|
+++ b/drivers/gpio/gpiolib-sysfs.c
|
||||||
@@ -544,7 +544,7 @@ static struct class gpio_class = {
|
@@ -553,7 +553,7 @@ static struct class gpio_class = {
|
||||||
*
|
*
|
||||||
* Returns zero on success, else an error.
|
* Returns zero on success, else an error.
|
||||||
*/
|
*/
|
||||||
@ -146,7 +146,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
{
|
{
|
||||||
struct gpio_chip *chip;
|
struct gpio_chip *chip;
|
||||||
struct gpio_device *gdev;
|
struct gpio_device *gdev;
|
||||||
@@ -606,6 +606,8 @@ int gpiod_export(struct gpio_desc *desc,
|
@@ -615,6 +615,8 @@ int gpiod_export(struct gpio_desc *desc,
|
||||||
offset = gpio_chip_hwgpio(desc);
|
offset = gpio_chip_hwgpio(desc);
|
||||||
if (chip->names && chip->names[offset])
|
if (chip->names && chip->names[offset])
|
||||||
ioname = chip->names[offset];
|
ioname = chip->names[offset];
|
||||||
@ -155,7 +155,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
|
|
||||||
dev = device_create_with_groups(&gpio_class, &gdev->dev,
|
dev = device_create_with_groups(&gpio_class, &gdev->dev,
|
||||||
MKDEV(0, 0), data, gpio_groups,
|
MKDEV(0, 0), data, gpio_groups,
|
||||||
@@ -627,6 +629,12 @@ err_unlock:
|
@@ -636,6 +638,12 @@ err_unlock:
|
||||||
gpiod_dbg(desc, "%s: status %d\n", __func__, status);
|
gpiod_dbg(desc, "%s: status %d\n", __func__, status);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
|
|
||||||
--- a/drivers/i2c/busses/Kconfig
|
--- a/drivers/i2c/busses/Kconfig
|
||||||
+++ b/drivers/i2c/busses/Kconfig
|
+++ b/drivers/i2c/busses/Kconfig
|
||||||
@@ -643,6 +643,16 @@ config I2C_MESON
|
@@ -696,6 +696,16 @@ config I2C_MESON
|
||||||
If you say yes to this option, support will be included for the
|
If you say yes to this option, support will be included for the
|
||||||
I2C interface on the Amlogic Meson family of SoCs.
|
I2C interface on the Amlogic Meson family of SoCs.
|
||||||
|
|
||||||
@ -37,7 +37,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
depends on PPC
|
depends on PPC
|
||||||
--- a/drivers/i2c/busses/Makefile
|
--- a/drivers/i2c/busses/Makefile
|
||||||
+++ b/drivers/i2c/busses/Makefile
|
+++ b/drivers/i2c/busses/Makefile
|
||||||
@@ -59,6 +59,7 @@ obj-$(CONFIG_I2C_IMX) += i2c-imx.o
|
@@ -68,6 +68,7 @@ obj-$(CONFIG_I2C_IMX_LPI2C) += i2c-imx-l
|
||||||
obj-$(CONFIG_I2C_IOP3XX) += i2c-iop3xx.o
|
obj-$(CONFIG_I2C_IOP3XX) += i2c-iop3xx.o
|
||||||
obj-$(CONFIG_I2C_JZ4780) += i2c-jz4780.o
|
obj-$(CONFIG_I2C_JZ4780) += i2c-jz4780.o
|
||||||
obj-$(CONFIG_I2C_KEMPLD) += i2c-kempld.o
|
obj-$(CONFIG_I2C_KEMPLD) += i2c-kempld.o
|
||||||
|
@ -27,14 +27,13 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
#endif /* _LTQ_XWAY_H__ */
|
#endif /* _LTQ_XWAY_H__ */
|
||||||
--- a/arch/mips/lantiq/xway/Makefile
|
--- a/arch/mips/lantiq/xway/Makefile
|
||||||
+++ b/arch/mips/lantiq/xway/Makefile
|
+++ b/arch/mips/lantiq/xway/Makefile
|
||||||
@@ -8,4 +8,7 @@ endif
|
@@ -7,3 +7,6 @@ obj-y += timer.o
|
||||||
|
endif
|
||||||
|
|
||||||
obj-y += vmmc.o
|
obj-y += vmmc.o
|
||||||
|
+
|
||||||
+obj-y += eth_mac.o
|
+obj-y += eth_mac.o
|
||||||
+obj-$(CONFIG_PCI) += ath5k_eep.o
|
+obj-$(CONFIG_PCI) += ath5k_eep.o
|
||||||
+
|
|
||||||
obj-$(CONFIG_XRX200_PHY_FW) += xrx200_phy_fw.o
|
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/arch/mips/lantiq/xway/ath5k_eep.c
|
+++ b/arch/mips/lantiq/xway/ath5k_eep.c
|
||||||
@@ -0,0 +1,136 @@
|
@@ -0,0 +1,136 @@
|
||||||
@ -204,7 +203,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
|||||||
+early_param("ethaddr", setup_ethaddr);
|
+early_param("ethaddr", setup_ethaddr);
|
||||||
--- a/drivers/net/ethernet/lantiq_etop.c
|
--- a/drivers/net/ethernet/lantiq_etop.c
|
||||||
+++ b/drivers/net/ethernet/lantiq_etop.c
|
+++ b/drivers/net/ethernet/lantiq_etop.c
|
||||||
@@ -794,7 +794,11 @@ ltq_etop_init(struct net_device *dev)
|
@@ -783,7 +783,11 @@ ltq_etop_init(struct net_device *dev)
|
||||||
if (err)
|
if (err)
|
||||||
goto err_hw;
|
goto err_hw;
|
||||||
|
|
||||||
|
@ -1,35 +0,0 @@
|
|||||||
--- a/drivers/usb/dwc2/platform.c
|
|
||||||
+++ b/drivers/usb/dwc2/platform.c
|
|
||||||
@@ -42,6 +42,7 @@
|
|
||||||
#include <linux/dma-mapping.h>
|
|
||||||
#include <linux/of_device.h>
|
|
||||||
#include <linux/mutex.h>
|
|
||||||
+#include <linux/of_gpio.h>
|
|
||||||
#include <linux/platform_device.h>
|
|
||||||
#include <linux/phy/phy.h>
|
|
||||||
#include <linux/platform_data/s3c-hsotg.h>
|
|
||||||
@@ -544,6 +545,7 @@ static int dwc2_driver_probe(struct plat
|
|
||||||
struct dwc2_hsotg *hsotg;
|
|
||||||
struct resource *res;
|
|
||||||
int retval;
|
|
||||||
+ int gpio_count;
|
|
||||||
|
|
||||||
match = of_match_device(dwc2_of_match_table, &dev->dev);
|
|
||||||
if (match && match->data) {
|
|
||||||
@@ -562,6 +564,16 @@ static int dwc2_driver_probe(struct plat
|
|
||||||
defparams.dma_desc_fs_enable = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ gpio_count = of_gpio_count(dev->dev.of_node);
|
|
||||||
+ while (gpio_count > 0) {
|
|
||||||
+ enum of_gpio_flags flags;
|
|
||||||
+ int gpio = of_get_gpio_flags(dev->dev.of_node, --gpio_count, &flags);
|
|
||||||
+ if (gpio_request(gpio, "usb"))
|
|
||||||
+ continue;
|
|
||||||
+ dev_info(&dev->dev, "requested GPIO %d\n", gpio);
|
|
||||||
+ gpio_direction_output(gpio, (flags & OF_GPIO_ACTIVE_LOW) ? (0) : (1));
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
hsotg = devm_kzalloc(&dev->dev, sizeof(*hsotg), GFP_KERNEL);
|
|
||||||
if (!hsotg)
|
|
||||||
return -ENOMEM;
|
|
@ -1,11 +0,0 @@
|
|||||||
--- a/drivers/pinctrl/pinctrl-xway.c
|
|
||||||
+++ b/drivers/pinctrl/pinctrl-xway.c
|
|
||||||
@@ -1028,7 +1028,7 @@ static const struct ltq_pin_group xrx200
|
|
||||||
GRP_MUX("spi_cs5", SPI, xrx200_pins_spi_cs5),
|
|
||||||
GRP_MUX("spi_cs6", SPI, xrx200_pins_spi_cs6),
|
|
||||||
GRP_MUX("usif uart_rx", USIF, xrx200_pins_usif_uart_rx),
|
|
||||||
- GRP_MUX("usif uart_rx", USIF, xrx200_pins_usif_uart_tx),
|
|
||||||
+ GRP_MUX("usif uart_tx", USIF, xrx200_pins_usif_uart_tx),
|
|
||||||
GRP_MUX("usif uart_rts", USIF, xrx200_pins_usif_uart_rts),
|
|
||||||
GRP_MUX("usif uart_cts", USIF, xrx200_pins_usif_uart_cts),
|
|
||||||
GRP_MUX("usif uart_dtr", USIF, xrx200_pins_usif_uart_dtr),
|
|
@ -1,23 +0,0 @@
|
|||||||
--- a/arch/mips/lantiq/xway/reset.c
|
|
||||||
+++ b/arch/mips/lantiq/xway/reset.c
|
|
||||||
@@ -301,12 +301,6 @@ static void ltq_machine_halt(void)
|
|
||||||
unreachable();
|
|
||||||
}
|
|
||||||
|
|
||||||
-static void ltq_machine_power_off(void)
|
|
||||||
-{
|
|
||||||
- local_irq_disable();
|
|
||||||
- unreachable();
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
static void ltq_usb_init(void)
|
|
||||||
{
|
|
||||||
/* Power for USB cores 1 & 2 */
|
|
||||||
@@ -379,7 +373,6 @@ static int __init mips_reboot_setup(void
|
|
||||||
|
|
||||||
_machine_restart = ltq_machine_restart;
|
|
||||||
_machine_halt = ltq_machine_halt;
|
|
||||||
- pm_power_off = ltq_machine_power_off;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,87 +0,0 @@
|
|||||||
From: Felix Fietkau <nbd@nbd.name>
|
|
||||||
Date: Thu, 19 Jan 2017 12:14:44 +0100
|
|
||||||
Subject: [PATCH] MIPS: Lantiq: Fix cascaded IRQ setup
|
|
||||||
|
|
||||||
With the IRQ stack changes integrated, the XRX200 devices started
|
|
||||||
emitting a constant stream of kernel messages like this:
|
|
||||||
|
|
||||||
[ 565.415310] Spurious IRQ: CAUSE=0x1100c300
|
|
||||||
|
|
||||||
This appears to be caused by IP0 firing for some reason without being
|
|
||||||
handled. Fix this by setting up IP2-6 as a proper chained IRQ handler and
|
|
||||||
calling do_IRQ for all MIPS CPU interrupts.
|
|
||||||
|
|
||||||
Cc: john@phrozen.org
|
|
||||||
Cc: stable@vger.kernel.org
|
|
||||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|
||||||
---
|
|
||||||
|
|
||||||
--- a/arch/mips/lantiq/irq.c
|
|
||||||
+++ b/arch/mips/lantiq/irq.c
|
|
||||||
@@ -271,6 +271,11 @@ static void ltq_hw5_irqdispatch(void)
|
|
||||||
DEFINE_HWx_IRQDISPATCH(5)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
+static void ltq_hw_irq_handler(struct irq_desc *desc)
|
|
||||||
+{
|
|
||||||
+ ltq_hw_irqdispatch(irq_desc_get_irq(desc) - 2);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
#ifdef CONFIG_MIPS_MT_SMP
|
|
||||||
void __init arch_init_ipiirq(int irq, struct irqaction *action)
|
|
||||||
{
|
|
||||||
@@ -315,23 +320,19 @@ static struct irqaction irq_call = {
|
|
||||||
asmlinkage void plat_irq_dispatch(void)
|
|
||||||
{
|
|
||||||
unsigned int pending = read_c0_status() & read_c0_cause() & ST0_IM;
|
|
||||||
- unsigned int i;
|
|
||||||
+ int irq;
|
|
||||||
|
|
||||||
- if ((MIPS_CPU_TIMER_IRQ == 7) && (pending & CAUSEF_IP7)) {
|
|
||||||
- do_IRQ(MIPS_CPU_TIMER_IRQ);
|
|
||||||
- goto out;
|
|
||||||
- } else {
|
|
||||||
- for (i = 0; i < MAX_IM; i++) {
|
|
||||||
- if (pending & (CAUSEF_IP2 << i)) {
|
|
||||||
- ltq_hw_irqdispatch(i);
|
|
||||||
- goto out;
|
|
||||||
- }
|
|
||||||
- }
|
|
||||||
+ if (!pending) {
|
|
||||||
+ spurious_interrupt();
|
|
||||||
+ return;
|
|
||||||
}
|
|
||||||
- pr_alert("Spurious IRQ: CAUSE=0x%08x\n", read_c0_status());
|
|
||||||
|
|
||||||
-out:
|
|
||||||
- return;
|
|
||||||
+ pending >>= CAUSEB_IP;
|
|
||||||
+ while (pending) {
|
|
||||||
+ irq = fls(pending) - 1;
|
|
||||||
+ do_IRQ(MIPS_CPU_IRQ_BASE + irq);
|
|
||||||
+ pending &= ~BIT(irq);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
static int icu_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw)
|
|
||||||
@@ -356,11 +357,6 @@ static const struct irq_domain_ops irq_d
|
|
||||||
.map = icu_map,
|
|
||||||
};
|
|
||||||
|
|
||||||
-static struct irqaction cascade = {
|
|
||||||
- .handler = no_action,
|
|
||||||
- .name = "cascade",
|
|
||||||
-};
|
|
||||||
-
|
|
||||||
int __init icu_of_init(struct device_node *node, struct device_node *parent)
|
|
||||||
{
|
|
||||||
struct device_node *eiu_node;
|
|
||||||
@@ -392,7 +388,7 @@ int __init icu_of_init(struct device_nod
|
|
||||||
mips_cpu_irq_init();
|
|
||||||
|
|
||||||
for (i = 0; i < MAX_IM; i++)
|
|
||||||
- setup_irq(i + 2, &cascade);
|
|
||||||
+ irq_set_chained_handler(i + 2, ltq_hw_irq_handler);
|
|
||||||
|
|
||||||
if (cpu_has_vint) {
|
|
||||||
pr_info("Setting up vectored interrupts\n");
|
|
@ -0,0 +1,78 @@
|
|||||||
|
From de2cad82c4d0872066f83ce59462603852b47f03 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Hauke Mehrtens <hauke@hauke-m.de>
|
||||||
|
Date: Fri, 6 Jan 2017 17:55:24 +0100
|
||||||
|
Subject: [PATCH 2/2] usb: dwc2: add support for other Lantiq SoCs
|
||||||
|
|
||||||
|
The size of the internal RAM of the DesignWare USB controller changed
|
||||||
|
between the different Lantiq SoCs. We have the following sizes:
|
||||||
|
|
||||||
|
Amazon + Danube: 8 KByte
|
||||||
|
Amazon SE + arx100: 2 KByte
|
||||||
|
xrx200 + xrx300: 2.5 KByte
|
||||||
|
|
||||||
|
For Danube SoC we do not provide the params and let the driver decide
|
||||||
|
to use sane defaults, for the Amazon SE and arx100 we use small fifos
|
||||||
|
and for the xrx200 and xrx300 SCs a little bit bigger periodic fifo.
|
||||||
|
The auto detection of max_transfer_size and max_packet_count should
|
||||||
|
work, so remove it.
|
||||||
|
|
||||||
|
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||||
|
---
|
||||||
|
drivers/usb/dwc2/platform.c | 46 ++++++++++++++++++++++++++++++++++++++-------
|
||||||
|
1 file changed, 39 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/usb/dwc2/params.c
|
||||||
|
+++ b/drivers/usb/dwc2/params.c
|
||||||
|
@@ -83,7 +83,14 @@ static void dwc2_set_rk_params(struct dw
|
||||||
|
GAHBCFG_HBSTLEN_SHIFT;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void dwc2_set_ltq_params(struct dwc2_hsotg *hsotg)
|
||||||
|
+static void dwc2_set_ltq_danube_params(struct dwc2_hsotg *hsotg)
|
||||||
|
+{
|
||||||
|
+ struct dwc2_core_params *p = &hsotg->params;
|
||||||
|
+
|
||||||
|
+ p->otg_cap = DWC2_CAP_PARAM_NO_HNP_SRP_CAPABLE;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void dwc2_set_ltq_ase_params(struct dwc2_hsotg *hsotg)
|
||||||
|
{
|
||||||
|
struct dwc2_core_params *p = &hsotg->params;
|
||||||
|
|
||||||
|
@@ -91,12 +98,20 @@ static void dwc2_set_ltq_params(struct d
|
||||||
|
p->host_rx_fifo_size = 288;
|
||||||
|
p->host_nperio_tx_fifo_size = 128;
|
||||||
|
p->host_perio_tx_fifo_size = 96;
|
||||||
|
- p->max_transfer_size = 65535;
|
||||||
|
- p->max_packet_count = 511;
|
||||||
|
p->ahbcfg = GAHBCFG_HBSTLEN_INCR16 <<
|
||||||
|
GAHBCFG_HBSTLEN_SHIFT;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void dwc2_set_ltq_xrx200_params(struct dwc2_hsotg *hsotg)
|
||||||
|
+{
|
||||||
|
+ struct dwc2_core_params *p = &hsotg->params;
|
||||||
|
+
|
||||||
|
+ p->otg_cap = DWC2_CAP_PARAM_NO_HNP_SRP_CAPABLE;
|
||||||
|
+ p->host_rx_fifo_size = 288;
|
||||||
|
+ p->host_nperio_tx_fifo_size = 128;
|
||||||
|
+ p->host_perio_tx_fifo_size = 136;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void dwc2_set_amlogic_params(struct dwc2_hsotg *hsotg)
|
||||||
|
{
|
||||||
|
struct dwc2_core_params *p = &hsotg->params;
|
||||||
|
@@ -140,8 +155,11 @@ const struct of_device_id dwc2_of_match_
|
||||||
|
{ .compatible = "brcm,bcm2835-usb", .data = dwc2_set_bcm_params },
|
||||||
|
{ .compatible = "hisilicon,hi6220-usb", .data = dwc2_set_his_params },
|
||||||
|
{ .compatible = "rockchip,rk3066-usb", .data = dwc2_set_rk_params },
|
||||||
|
- { .compatible = "lantiq,arx100-usb", .data = dwc2_set_ltq_params },
|
||||||
|
- { .compatible = "lantiq,xrx200-usb", .data = dwc2_set_ltq_params },
|
||||||
|
+ { .compatible = "lantiq,danube-usb", .data = &dwc2_set_ltq_danube_params },
|
||||||
|
+ { .compatible = "lantiq,ase-usb", .data = &dwc2_set_ltq_ase_params },
|
||||||
|
+ { .compatible = "lantiq,arx100-usb", .data = &dwc2_set_ltq_ase_params },
|
||||||
|
+ { .compatible = "lantiq,xrx200-usb", .data = &dwc2_set_ltq_xrx200_params },
|
||||||
|
+ { .compatible = "lantiq,xrx300-usb", .data = &dwc2_set_ltq_xrx200_params },
|
||||||
|
{ .compatible = "snps,dwc2" },
|
||||||
|
{ .compatible = "samsung,s3c6400-hsotg" },
|
||||||
|
{ .compatible = "amlogic,meson8-usb",
|
@ -0,0 +1,49 @@
|
|||||||
|
From 14909c4e4e836925668e74fc6e0e85ba0283cbf9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Hauke Mehrtens <hauke@hauke-m.de>
|
||||||
|
Date: Fri, 6 Jan 2017 17:40:12 +0100
|
||||||
|
Subject: [PATCH 2/2] MIPS: lantiq: improve USB initialization
|
||||||
|
|
||||||
|
This adds code to initialize the USB controller and PHY also on Danube,
|
||||||
|
Amazon SE and AR10. This code is based on the Vendor driver from
|
||||||
|
different UGW versions and compared to the hardware documentation.
|
||||||
|
|
||||||
|
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||||
|
---
|
||||||
|
arch/mips/lantiq/xway/sysctrl.c | 20 +++++++
|
||||||
|
2 files changed, 110 insertions(+), 30 deletions(-)
|
||||||
|
|
||||||
|
|
||||||
|
--- a/arch/mips/lantiq/xway/sysctrl.c
|
||||||
|
+++ b/arch/mips/lantiq/xway/sysctrl.c
|
||||||
|
@@ -246,6 +246,25 @@ static void pmu_disable(struct clk *clk)
|
||||||
|
pr_warn("deactivating PMU module failed!");
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void usb_set_clock(void)
|
||||||
|
+{
|
||||||
|
+ unsigned int val = ltq_cgu_r32(ifccr);
|
||||||
|
+
|
||||||
|
+ if (of_machine_is_compatible("lantiq,ar10") ||
|
||||||
|
+ of_machine_is_compatible("lantiq,grx390")) {
|
||||||
|
+ val &= ~0x03; /* XTAL divided by 3 */
|
||||||
|
+ } else if (of_machine_is_compatible("lantiq,ar9") ||
|
||||||
|
+ of_machine_is_compatible("lantiq,vr9")) {
|
||||||
|
+ /* TODO: this depends on the XTAL frequency */
|
||||||
|
+ val |= 0x03; /* XTAL divided by 3 */
|
||||||
|
+ } else if (of_machine_is_compatible("lantiq,ase")) {
|
||||||
|
+ val |= 0x20; /* from XTAL */
|
||||||
|
+ } else if (of_machine_is_compatible("lantiq,danube")) {
|
||||||
|
+ val |= 0x30; /* 12 MHz, generated from 36 MHz */
|
||||||
|
+ }
|
||||||
|
+ ltq_cgu_w32(val, ifccr);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* the pci enable helper */
|
||||||
|
static int pci_enable(struct clk *clk)
|
||||||
|
{
|
||||||
|
@@ -569,4 +588,5 @@ void __init ltq_soc_init(void)
|
||||||
|
clkdev_add_pmu("1e116000.mei", "dfe", 1, 0, PMU_DFE);
|
||||||
|
clkdev_add_pmu("1e100400.serial", NULL, 1, 0, PMU_ASC0);
|
||||||
|
}
|
||||||
|
+ usb_set_clock();
|
||||||
|
}
|
@ -1,130 +0,0 @@
|
|||||||
From de2cad82c4d0872066f83ce59462603852b47f03 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Hauke Mehrtens <hauke@hauke-m.de>
|
|
||||||
Date: Fri, 6 Jan 2017 17:55:24 +0100
|
|
||||||
Subject: [PATCH 2/2] usb: dwc2: add support for other Lantiq SoCs
|
|
||||||
|
|
||||||
The size of the internal RAM of the DesignWare USB controller changed
|
|
||||||
between the different Lantiq SoCs. We have the following sizes:
|
|
||||||
|
|
||||||
Amazon + Danube: 8 KByte
|
|
||||||
Amazon SE + arx100: 2 KByte
|
|
||||||
xrx200 + xrx300: 2.5 KByte
|
|
||||||
|
|
||||||
For Danube SoC we do not provide the params and let the driver decide
|
|
||||||
to use sane defaults, for the Amazon SE and arx100 we use small fifos
|
|
||||||
and for the xrx200 and xrx300 SCs a little bit bigger periodic fifo.
|
|
||||||
The auto detection of max_transfer_size and max_packet_count should
|
|
||||||
work, so remove it.
|
|
||||||
|
|
||||||
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
|
||||||
---
|
|
||||||
drivers/usb/dwc2/platform.c | 46 ++++++++++++++++++++++++++++++++++++++-------
|
|
||||||
1 file changed, 39 insertions(+), 7 deletions(-)
|
|
||||||
|
|
||||||
--- a/drivers/usb/dwc2/platform.c
|
|
||||||
+++ b/drivers/usb/dwc2/platform.c
|
|
||||||
@@ -151,7 +151,38 @@ static const struct dwc2_core_params par
|
|
||||||
.hibernation = -1,
|
|
||||||
};
|
|
||||||
|
|
||||||
-static const struct dwc2_core_params params_ltq = {
|
|
||||||
+static const struct dwc2_core_params params_danube = {
|
|
||||||
+ .otg_cap = 2, /* non-HNP/non-SRP */
|
|
||||||
+ .otg_ver = -1,
|
|
||||||
+ .dma_enable = -1,
|
|
||||||
+ .dma_desc_enable = -1,
|
|
||||||
+ .dma_desc_fs_enable = -1,
|
|
||||||
+ .speed = -1,
|
|
||||||
+ .enable_dynamic_fifo = -1,
|
|
||||||
+ .en_multiple_tx_fifo = -1,
|
|
||||||
+ .host_rx_fifo_size = -1,
|
|
||||||
+ .host_nperio_tx_fifo_size = -1,
|
|
||||||
+ .host_perio_tx_fifo_size = -1,
|
|
||||||
+ .max_transfer_size = -1,
|
|
||||||
+ .max_packet_count = -1,
|
|
||||||
+ .host_channels = -1,
|
|
||||||
+ .phy_type = -1,
|
|
||||||
+ .phy_utmi_width = -1,
|
|
||||||
+ .phy_ulpi_ddr = -1,
|
|
||||||
+ .phy_ulpi_ext_vbus = -1,
|
|
||||||
+ .i2c_enable = -1,
|
|
||||||
+ .ulpi_fs_ls = -1,
|
|
||||||
+ .host_support_fs_ls_low_power = -1,
|
|
||||||
+ .host_ls_low_power_phy_clk = -1,
|
|
||||||
+ .ts_dline = -1,
|
|
||||||
+ .reload_ctl = -1,
|
|
||||||
+ .ahbcfg = -1,
|
|
||||||
+ .uframe_sched = -1,
|
|
||||||
+ .external_id_pin_ctl = -1,
|
|
||||||
+ .hibernation = -1,
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static const struct dwc2_core_params params_ase = {
|
|
||||||
.otg_cap = 2, /* non-HNP/non-SRP */
|
|
||||||
.otg_ver = -1,
|
|
||||||
.dma_enable = -1,
|
|
||||||
@@ -163,8 +194,8 @@ static const struct dwc2_core_params par
|
|
||||||
.host_rx_fifo_size = 288, /* 288 DWORDs */
|
|
||||||
.host_nperio_tx_fifo_size = 128, /* 128 DWORDs */
|
|
||||||
.host_perio_tx_fifo_size = 96, /* 96 DWORDs */
|
|
||||||
- .max_transfer_size = 65535,
|
|
||||||
- .max_packet_count = 511,
|
|
||||||
+ .max_transfer_size = -1,
|
|
||||||
+ .max_packet_count = -1,
|
|
||||||
.host_channels = -1,
|
|
||||||
.phy_type = -1,
|
|
||||||
.phy_utmi_width = -1,
|
|
||||||
@@ -176,8 +207,37 @@ static const struct dwc2_core_params par
|
|
||||||
.host_ls_low_power_phy_clk = -1,
|
|
||||||
.ts_dline = -1,
|
|
||||||
.reload_ctl = -1,
|
|
||||||
- .ahbcfg = GAHBCFG_HBSTLEN_INCR16 <<
|
|
||||||
- GAHBCFG_HBSTLEN_SHIFT,
|
|
||||||
+ .ahbcfg = -1,
|
|
||||||
+ .uframe_sched = -1,
|
|
||||||
+ .external_id_pin_ctl = -1,
|
|
||||||
+ .hibernation = -1,
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static const struct dwc2_core_params params_xrx200 = {
|
|
||||||
+ .otg_cap = 2, /* non-HNP/non-SRP */
|
|
||||||
+ .otg_ver = -1,
|
|
||||||
+ .dma_enable = -1,
|
|
||||||
+ .dma_desc_enable = -1,
|
|
||||||
+ .speed = -1,
|
|
||||||
+ .enable_dynamic_fifo = -1,
|
|
||||||
+ .en_multiple_tx_fifo = -1,
|
|
||||||
+ .host_rx_fifo_size = 288, /* 288 DWORDs */
|
|
||||||
+ .host_nperio_tx_fifo_size = 128, /* 128 DWORDs */
|
|
||||||
+ .host_perio_tx_fifo_size = 136, /* 136 DWORDs */
|
|
||||||
+ .max_transfer_size = -1,
|
|
||||||
+ .max_packet_count = -1,
|
|
||||||
+ .host_channels = -1,
|
|
||||||
+ .phy_type = -1,
|
|
||||||
+ .phy_utmi_width = -1,
|
|
||||||
+ .phy_ulpi_ddr = -1,
|
|
||||||
+ .phy_ulpi_ext_vbus = -1,
|
|
||||||
+ .i2c_enable = -1,
|
|
||||||
+ .ulpi_fs_ls = -1,
|
|
||||||
+ .host_support_fs_ls_low_power = -1,
|
|
||||||
+ .host_ls_low_power_phy_clk = -1,
|
|
||||||
+ .ts_dline = -1,
|
|
||||||
+ .reload_ctl = -1,
|
|
||||||
+ .ahbcfg = -1,
|
|
||||||
.uframe_sched = -1,
|
|
||||||
.external_id_pin_ctl = -1,
|
|
||||||
.hibernation = -1,
|
|
||||||
@@ -515,8 +575,11 @@ static const struct of_device_id dwc2_of
|
|
||||||
{ .compatible = "brcm,bcm2835-usb", .data = ¶ms_bcm2835 },
|
|
||||||
{ .compatible = "hisilicon,hi6220-usb", .data = ¶ms_hi6220 },
|
|
||||||
{ .compatible = "rockchip,rk3066-usb", .data = ¶ms_rk3066 },
|
|
||||||
- { .compatible = "lantiq,arx100-usb", .data = ¶ms_ltq },
|
|
||||||
- { .compatible = "lantiq,xrx200-usb", .data = ¶ms_ltq },
|
|
||||||
+ { .compatible = "lantiq,danube-usb", .data = ¶ms_danube },
|
|
||||||
+ { .compatible = "lantiq,ase-usb", .data = ¶ms_ase },
|
|
||||||
+ { .compatible = "lantiq,arx100-usb", .data = ¶ms_ase },
|
|
||||||
+ { .compatible = "lantiq,xrx200-usb", .data = ¶ms_xrx200 },
|
|
||||||
+ { .compatible = "lantiq,xrx300-usb", .data = ¶ms_xrx200 },
|
|
||||||
{ .compatible = "snps,dwc2", .data = NULL },
|
|
||||||
{ .compatible = "samsung,s3c6400-hsotg", .data = NULL},
|
|
||||||
{ .compatible = "amlogic,meson8b-usb", .data = ¶ms_amlogic },
|
|
@ -1,202 +0,0 @@
|
|||||||
From 14909c4e4e836925668e74fc6e0e85ba0283cbf9 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Hauke Mehrtens <hauke@hauke-m.de>
|
|
||||||
Date: Fri, 6 Jan 2017 17:40:12 +0100
|
|
||||||
Subject: [PATCH 2/2] MIPS: lantiq: improve USB initialization
|
|
||||||
|
|
||||||
This adds code to initialize the USB controller and PHY also on Danube,
|
|
||||||
Amazon SE and AR10. This code is based on the Vendor driver from
|
|
||||||
different UGW versions and compared to the hardware documentation.
|
|
||||||
|
|
||||||
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
|
||||||
---
|
|
||||||
arch/mips/lantiq/xway/reset.c | 120 ++++++++++++++++++++++++++++++----------
|
|
||||||
arch/mips/lantiq/xway/sysctrl.c | 20 +++++++
|
|
||||||
2 files changed, 110 insertions(+), 30 deletions(-)
|
|
||||||
|
|
||||||
--- a/arch/mips/lantiq/xway/reset.c
|
|
||||||
+++ b/arch/mips/lantiq/xway/reset.c
|
|
||||||
@@ -72,6 +72,8 @@
|
|
||||||
#define RCU_USBCFG_HDSEL_BIT BIT(11)
|
|
||||||
#define RCU_USBCFG_HOST_END_BIT BIT(10)
|
|
||||||
#define RCU_USBCFG_SLV_END_BIT BIT(9)
|
|
||||||
+#define RCU_USBCFG_SLV_END_BIT_AR9 BIT(17)
|
|
||||||
+
|
|
||||||
|
|
||||||
/* USB reset bits */
|
|
||||||
#define RCU_USBRESET 0x0010
|
|
||||||
@@ -85,6 +87,8 @@
|
|
||||||
|
|
||||||
#define RCU_CFG1A 0x0038
|
|
||||||
#define RCU_CFG1B 0x003C
|
|
||||||
+#define RCU_CFG1_TX_PEE BIT(0)
|
|
||||||
+#define RCU_CFG1_DIS_THR_SHIFT 15 /* Disconnect Threshold */
|
|
||||||
|
|
||||||
/* USB PMU devices */
|
|
||||||
#define PMU_AHBM BIT(15)
|
|
||||||
@@ -306,38 +310,91 @@ static void ltq_usb_init(void)
|
|
||||||
/* Power for USB cores 1 & 2 */
|
|
||||||
ltq_pmu_enable(PMU_AHBM);
|
|
||||||
ltq_pmu_enable(PMU_USB0);
|
|
||||||
- ltq_pmu_enable(PMU_USB1);
|
|
||||||
|
|
||||||
- ltq_rcu_w32(ltq_rcu_r32(RCU_CFG1A) | BIT(0), RCU_CFG1A);
|
|
||||||
- ltq_rcu_w32(ltq_rcu_r32(RCU_CFG1B) | BIT(0), RCU_CFG1B);
|
|
||||||
+ if (of_machine_is_compatible("lantiq,ar10") ||
|
|
||||||
+ of_machine_is_compatible("lantiq,grx390") ||
|
|
||||||
+ of_machine_is_compatible("lantiq,ar9") ||
|
|
||||||
+ of_machine_is_compatible("lantiq,vr9"))
|
|
||||||
+ ltq_pmu_enable(PMU_USB1);
|
|
||||||
+
|
|
||||||
+ if (of_machine_is_compatible("lantiq,vr9") ||
|
|
||||||
+ of_machine_is_compatible("lantiq,ar10")) {
|
|
||||||
+ ltq_rcu_w32(ltq_rcu_r32(RCU_CFG1A) | RCU_CFG1_TX_PEE |
|
|
||||||
+ 7 << RCU_CFG1_DIS_THR_SHIFT, RCU_CFG1A);
|
|
||||||
+ ltq_rcu_w32(ltq_rcu_r32(RCU_CFG1B) | RCU_CFG1_TX_PEE |
|
|
||||||
+ 7 << RCU_CFG1_DIS_THR_SHIFT, RCU_CFG1B);
|
|
||||||
+ }
|
|
||||||
|
|
||||||
/* Enable USB PHY power for cores 1 & 2 */
|
|
||||||
ltq_pmu_enable(PMU_USB0_P);
|
|
||||||
- ltq_pmu_enable(PMU_USB1_P);
|
|
||||||
+ if (of_machine_is_compatible("lantiq,ar10") ||
|
|
||||||
+ of_machine_is_compatible("lantiq,grx390") ||
|
|
||||||
+ of_machine_is_compatible("lantiq,ar9") ||
|
|
||||||
+ of_machine_is_compatible("lantiq,vr9"))
|
|
||||||
+ ltq_pmu_enable(PMU_USB1_P);
|
|
||||||
+
|
|
||||||
+ if (of_machine_is_compatible("lantiq,ase") ||
|
|
||||||
+ of_machine_is_compatible("lantiq,danube")) {
|
|
||||||
+ /* Configure cores to host mode */
|
|
||||||
+ ltq_rcu_w32(ltq_rcu_r32(RCU_USB1CFG) & ~RCU_USBCFG_HDSEL_BIT,
|
|
||||||
+ RCU_USB1CFG);
|
|
||||||
+
|
|
||||||
+ /* Select DMA endianness (Host-endian: big-endian) */
|
|
||||||
+ ltq_rcu_w32((ltq_rcu_r32(RCU_USB1CFG) & ~RCU_USBCFG_SLV_END_BIT)
|
|
||||||
+ | RCU_USBCFG_HOST_END_BIT, RCU_USB1CFG);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (of_machine_is_compatible("lantiq,ar9")) {
|
|
||||||
+ /* Configure cores to host mode */
|
|
||||||
+ ltq_rcu_w32(ltq_rcu_r32(RCU_USB1CFG) & ~RCU_USBCFG_HDSEL_BIT,
|
|
||||||
+ RCU_USB1CFG);
|
|
||||||
+ ltq_rcu_w32(ltq_rcu_r32(RCU_USB2CFG) & ~RCU_USBCFG_HDSEL_BIT,
|
|
||||||
+ RCU_USB2CFG);
|
|
||||||
+
|
|
||||||
+ /* Select DMA endianness (Host-endian: big-endian) */
|
|
||||||
+ ltq_rcu_w32((ltq_rcu_r32(RCU_USB1CFG) & ~RCU_USBCFG_SLV_END_BIT_AR9)
|
|
||||||
+ | RCU_USBCFG_HOST_END_BIT, RCU_USB1CFG);
|
|
||||||
+ ltq_rcu_w32(ltq_rcu_r32((RCU_USB2CFG) & ~RCU_USBCFG_SLV_END_BIT_AR9)
|
|
||||||
+ | RCU_USBCFG_HOST_END_BIT, RCU_USB2CFG);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (of_machine_is_compatible("lantiq,vr9") ||
|
|
||||||
+ of_machine_is_compatible("lantiq,ar10")) {
|
|
||||||
+ /* Configure cores to host mode */
|
|
||||||
+ ltq_rcu_w32(ltq_rcu_r32(RCU_USB1CFG) & ~RCU_USBCFG_HDSEL_BIT,
|
|
||||||
+ RCU_USB1CFG);
|
|
||||||
+ ltq_rcu_w32(ltq_rcu_r32(RCU_USB2CFG) & ~RCU_USBCFG_HDSEL_BIT,
|
|
||||||
+ RCU_USB2CFG);
|
|
||||||
+
|
|
||||||
+ /* Select DMA endianness (Host-endian: big-endian) */
|
|
||||||
+ ltq_rcu_w32((ltq_rcu_r32(RCU_USB1CFG) & ~RCU_USBCFG_SLV_END_BIT)
|
|
||||||
+ | RCU_USBCFG_HOST_END_BIT, RCU_USB1CFG);
|
|
||||||
+ ltq_rcu_w32(ltq_rcu_r32((RCU_USB2CFG) & ~RCU_USBCFG_SLV_END_BIT)
|
|
||||||
+ | RCU_USBCFG_HOST_END_BIT, RCU_USB2CFG);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (of_machine_is_compatible("lantiq,ar9")) {
|
|
||||||
+ /* Hard reset USB state machines */
|
|
||||||
+ ltq_rcu_w32(ltq_rcu_r32(RCU_USBRESET)
|
|
||||||
+ | USBRESET_BIT | BIT(28), RCU_USBRESET);
|
|
||||||
+ udelay(50 * 1000);
|
|
||||||
+ ltq_rcu_w32(ltq_rcu_r32(RCU_USBRESET)
|
|
||||||
+ & ~(USBRESET_BIT | BIT(28)), RCU_USBRESET);
|
|
||||||
+ } else {
|
|
||||||
+ /* Hard reset USB state machines */
|
|
||||||
+ ltq_rcu_w32(ltq_rcu_r32(RCU_USBRESET) | USBRESET_BIT, RCU_USBRESET);
|
|
||||||
+ udelay(50 * 1000);
|
|
||||||
+ ltq_rcu_w32(ltq_rcu_r32(RCU_USBRESET) & ~USBRESET_BIT, RCU_USBRESET);
|
|
||||||
+ }
|
|
||||||
|
|
||||||
- /* Configure cores to host mode */
|
|
||||||
- ltq_rcu_w32(ltq_rcu_r32(RCU_USB1CFG) & ~RCU_USBCFG_HDSEL_BIT,
|
|
||||||
- RCU_USB1CFG);
|
|
||||||
- ltq_rcu_w32(ltq_rcu_r32(RCU_USB2CFG) & ~RCU_USBCFG_HDSEL_BIT,
|
|
||||||
- RCU_USB2CFG);
|
|
||||||
-
|
|
||||||
- /* Select DMA endianness (Host-endian: big-endian) */
|
|
||||||
- ltq_rcu_w32((ltq_rcu_r32(RCU_USB1CFG) & ~RCU_USBCFG_SLV_END_BIT)
|
|
||||||
- | RCU_USBCFG_HOST_END_BIT, RCU_USB1CFG);
|
|
||||||
- ltq_rcu_w32(ltq_rcu_r32((RCU_USB2CFG) & ~RCU_USBCFG_SLV_END_BIT)
|
|
||||||
- | RCU_USBCFG_HOST_END_BIT, RCU_USB2CFG);
|
|
||||||
-
|
|
||||||
- /* Hard reset USB state machines */
|
|
||||||
- ltq_rcu_w32(ltq_rcu_r32(RCU_USBRESET) | USBRESET_BIT, RCU_USBRESET);
|
|
||||||
- udelay(50 * 1000);
|
|
||||||
- ltq_rcu_w32(ltq_rcu_r32(RCU_USBRESET) & ~USBRESET_BIT, RCU_USBRESET);
|
|
||||||
-
|
|
||||||
- /* Soft reset USB state machines */
|
|
||||||
- ltq_rcu_w32(ltq_rcu_r32(RCU_USBRESET2)
|
|
||||||
- | USB1RESET_BIT | USB2RESET_BIT, RCU_USBRESET2);
|
|
||||||
- udelay(50 * 1000);
|
|
||||||
- ltq_rcu_w32(ltq_rcu_r32(RCU_USBRESET2)
|
|
||||||
- & ~(USB1RESET_BIT | USB2RESET_BIT), RCU_USBRESET2);
|
|
||||||
+ if (of_machine_is_compatible("lantiq,vr9")) {
|
|
||||||
+ /* Soft reset USB state machines */
|
|
||||||
+ ltq_rcu_w32(ltq_rcu_r32(RCU_USBRESET2)
|
|
||||||
+ | USB1RESET_BIT | USB2RESET_BIT, RCU_USBRESET2);
|
|
||||||
+ udelay(50 * 1000);
|
|
||||||
+ ltq_rcu_w32(ltq_rcu_r32(RCU_USBRESET2)
|
|
||||||
+ & ~(USB1RESET_BIT | USB2RESET_BIT), RCU_USBRESET2);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
static int __init mips_reboot_setup(void)
|
|
||||||
@@ -363,8 +420,11 @@ static int __init mips_reboot_setup(void
|
|
||||||
if (!ltq_rcu_membase)
|
|
||||||
panic("Failed to remap core memory");
|
|
||||||
|
|
||||||
- if (of_machine_is_compatible("lantiq,ar9") ||
|
|
||||||
- of_machine_is_compatible("lantiq,vr9"))
|
|
||||||
+ if (of_machine_is_compatible("lantiq,danube") ||
|
|
||||||
+ of_machine_is_compatible("lantiq,ase") ||
|
|
||||||
+ of_machine_is_compatible("lantiq,ar9") ||
|
|
||||||
+ of_machine_is_compatible("lantiq,vr9") ||
|
|
||||||
+ of_machine_is_compatible("lantiq,ar10"))
|
|
||||||
ltq_usb_init();
|
|
||||||
|
|
||||||
if (of_machine_is_compatible("lantiq,vr9"))
|
|
||||||
--- a/arch/mips/lantiq/xway/sysctrl.c
|
|
||||||
+++ b/arch/mips/lantiq/xway/sysctrl.c
|
|
||||||
@@ -254,6 +254,25 @@ static void pmu_disable(struct clk *clk)
|
|
||||||
pr_warn("deactivating PMU module failed!");
|
|
||||||
}
|
|
||||||
|
|
||||||
+static void usb_set_clock(void)
|
|
||||||
+{
|
|
||||||
+ unsigned int val = ltq_cgu_r32(ifccr);
|
|
||||||
+
|
|
||||||
+ if (of_machine_is_compatible("lantiq,ar10") ||
|
|
||||||
+ of_machine_is_compatible("lantiq,grx390")) {
|
|
||||||
+ val &= ~0x03; /* XTAL divided by 3 */
|
|
||||||
+ } else if (of_machine_is_compatible("lantiq,ar9") ||
|
|
||||||
+ of_machine_is_compatible("lantiq,vr9")) {
|
|
||||||
+ /* TODO: this depends on the XTAL frequency */
|
|
||||||
+ val |= 0x03; /* XTAL divided by 3 */
|
|
||||||
+ } else if (of_machine_is_compatible("lantiq,ase")) {
|
|
||||||
+ val |= 0x20; /* from XTAL */
|
|
||||||
+ } else if (of_machine_is_compatible("lantiq,danube")) {
|
|
||||||
+ val |= 0x30; /* 12 MHz, generated from 36 MHz */
|
|
||||||
+ }
|
|
||||||
+ ltq_cgu_w32(val, ifccr);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/* the pci enable helper */
|
|
||||||
static int pci_enable(struct clk *clk)
|
|
||||||
{
|
|
||||||
@@ -608,4 +627,5 @@ void __init ltq_soc_init(void)
|
|
||||||
|
|
||||||
if (of_machine_is_compatible("lantiq,vr9"))
|
|
||||||
xbar_fpi_burst_disable();
|
|
||||||
+ usb_set_clock();
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
@ -1,28 +0,0 @@
|
|||||||
From ba6e1e39969fa5435127a632757e2906caca7730 Mon Sep 17 00:00:00 2001
|
|
||||||
From: kbuild test robot <fengguang.wu@intel.com>
|
|
||||||
Date: Mon, 20 Feb 2017 01:33:10 +0800
|
|
||||||
Subject: spi: lantiq-ssc: fix platform_no_drv_owner.cocci warnings
|
|
||||||
|
|
||||||
drivers/spi/spi-lantiq-ssc.c:973:3-8: No need to set .owner here. The core will do it.
|
|
||||||
|
|
||||||
Remove .owner field if calls are used which set it automatically
|
|
||||||
|
|
||||||
Generated by: scripts/coccinelle/api/platform_no_drv_owner.cocci
|
|
||||||
|
|
||||||
Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
|
|
||||||
Acked-by: Hauke Mehrtens <hauke@hauke-m.de>
|
|
||||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
|
||||||
---
|
|
||||||
drivers/spi/spi-lantiq-ssc.c | 1 -
|
|
||||||
1 file changed, 1 deletion(-)
|
|
||||||
|
|
||||||
--- a/drivers/spi/spi-lantiq-ssc.c
|
|
||||||
+++ b/drivers/spi/spi-lantiq-ssc.c
|
|
||||||
@@ -970,7 +970,6 @@ static struct platform_driver lantiq_ssc
|
|
||||||
.remove = lantiq_ssc_remove,
|
|
||||||
.driver = {
|
|
||||||
.name = "spi-lantiq-ssc",
|
|
||||||
- .owner = THIS_MODULE,
|
|
||||||
.of_match_table = lantiq_ssc_match,
|
|
||||||
},
|
|
||||||
};
|
|
@ -1,723 +0,0 @@
|
|||||||
From 1aa83e0a2821cd7f4e8f3ddb367859f52e468bf1 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Hauke Mehrtens <hauke@hauke-m.de>
|
|
||||||
Date: Mon, 27 Feb 2017 23:21:25 +0100
|
|
||||||
Subject: spi: lantiq-ssc: add LTQ_ prefix to defines
|
|
||||||
|
|
||||||
The blackfin architecture has a SPI_STAT define which conflicts with
|
|
||||||
the define from the spi-lantiq-ssc driver in compile test mode. Fix
|
|
||||||
this by adding a prefix in front of every define.
|
|
||||||
|
|
||||||
Reported-by: kbuild test robot <fengguang.wu@intel.com>
|
|
||||||
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
|
||||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
|
||||||
---
|
|
||||||
drivers/spi/spi-lantiq-ssc.c | 437 ++++++++++++++++++++++---------------------
|
|
||||||
1 file changed, 222 insertions(+), 215 deletions(-)
|
|
||||||
|
|
||||||
--- a/drivers/spi/spi-lantiq-ssc.c
|
|
||||||
+++ b/drivers/spi/spi-lantiq-ssc.c
|
|
||||||
@@ -26,136 +26,140 @@
|
|
||||||
#include <lantiq_soc.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
-#define SPI_RX_IRQ_NAME "spi_rx"
|
|
||||||
-#define SPI_TX_IRQ_NAME "spi_tx"
|
|
||||||
-#define SPI_ERR_IRQ_NAME "spi_err"
|
|
||||||
-#define SPI_FRM_IRQ_NAME "spi_frm"
|
|
||||||
-
|
|
||||||
-#define SPI_CLC 0x00
|
|
||||||
-#define SPI_PISEL 0x04
|
|
||||||
-#define SPI_ID 0x08
|
|
||||||
-#define SPI_CON 0x10
|
|
||||||
-#define SPI_STAT 0x14
|
|
||||||
-#define SPI_WHBSTATE 0x18
|
|
||||||
-#define SPI_TB 0x20
|
|
||||||
-#define SPI_RB 0x24
|
|
||||||
-#define SPI_RXFCON 0x30
|
|
||||||
-#define SPI_TXFCON 0x34
|
|
||||||
-#define SPI_FSTAT 0x38
|
|
||||||
-#define SPI_BRT 0x40
|
|
||||||
-#define SPI_BRSTAT 0x44
|
|
||||||
-#define SPI_SFCON 0x60
|
|
||||||
-#define SPI_SFSTAT 0x64
|
|
||||||
-#define SPI_GPOCON 0x70
|
|
||||||
-#define SPI_GPOSTAT 0x74
|
|
||||||
-#define SPI_FPGO 0x78
|
|
||||||
-#define SPI_RXREQ 0x80
|
|
||||||
-#define SPI_RXCNT 0x84
|
|
||||||
-#define SPI_DMACON 0xec
|
|
||||||
-#define SPI_IRNEN 0xf4
|
|
||||||
-#define SPI_IRNICR 0xf8
|
|
||||||
-#define SPI_IRNCR 0xfc
|
|
||||||
-
|
|
||||||
-#define SPI_CLC_SMC_S 16 /* Clock divider for sleep mode */
|
|
||||||
-#define SPI_CLC_SMC_M (0xFF << SPI_CLC_SMC_S)
|
|
||||||
-#define SPI_CLC_RMC_S 8 /* Clock divider for normal run mode */
|
|
||||||
-#define SPI_CLC_RMC_M (0xFF << SPI_CLC_RMC_S)
|
|
||||||
-#define SPI_CLC_DISS BIT(1) /* Disable status bit */
|
|
||||||
-#define SPI_CLC_DISR BIT(0) /* Disable request bit */
|
|
||||||
-
|
|
||||||
-#define SPI_ID_TXFS_S 24 /* Implemented TX FIFO size */
|
|
||||||
-#define SPI_ID_TXFS_M (0x3F << SPI_ID_TXFS_S)
|
|
||||||
-#define SPI_ID_RXFS_S 16 /* Implemented RX FIFO size */
|
|
||||||
-#define SPI_ID_RXFS_M (0x3F << SPI_ID_RXFS_S)
|
|
||||||
-#define SPI_ID_MOD_S 8 /* Module ID */
|
|
||||||
-#define SPI_ID_MOD_M (0xff << SPI_ID_MOD_S)
|
|
||||||
-#define SPI_ID_CFG_S 5 /* DMA interface support */
|
|
||||||
-#define SPI_ID_CFG_M (1 << SPI_ID_CFG_S)
|
|
||||||
-#define SPI_ID_REV_M 0x1F /* Hardware revision number */
|
|
||||||
-
|
|
||||||
-#define SPI_CON_BM_S 16 /* Data width selection */
|
|
||||||
-#define SPI_CON_BM_M (0x1F << SPI_CON_BM_S)
|
|
||||||
-#define SPI_CON_EM BIT(24) /* Echo mode */
|
|
||||||
-#define SPI_CON_IDLE BIT(23) /* Idle bit value */
|
|
||||||
-#define SPI_CON_ENBV BIT(22) /* Enable byte valid control */
|
|
||||||
-#define SPI_CON_RUEN BIT(12) /* Receive underflow error enable */
|
|
||||||
-#define SPI_CON_TUEN BIT(11) /* Transmit underflow error enable */
|
|
||||||
-#define SPI_CON_AEN BIT(10) /* Abort error enable */
|
|
||||||
-#define SPI_CON_REN BIT(9) /* Receive overflow error enable */
|
|
||||||
-#define SPI_CON_TEN BIT(8) /* Transmit overflow error enable */
|
|
||||||
-#define SPI_CON_LB BIT(7) /* Loopback control */
|
|
||||||
-#define SPI_CON_PO BIT(6) /* Clock polarity control */
|
|
||||||
-#define SPI_CON_PH BIT(5) /* Clock phase control */
|
|
||||||
-#define SPI_CON_HB BIT(4) /* Heading control */
|
|
||||||
-#define SPI_CON_RXOFF BIT(1) /* Switch receiver off */
|
|
||||||
-#define SPI_CON_TXOFF BIT(0) /* Switch transmitter off */
|
|
||||||
-
|
|
||||||
-#define SPI_STAT_RXBV_S 28
|
|
||||||
-#define SPI_STAT_RXBV_M (0x7 << SPI_STAT_RXBV_S)
|
|
||||||
-#define SPI_STAT_BSY BIT(13) /* Busy flag */
|
|
||||||
-#define SPI_STAT_RUE BIT(12) /* Receive underflow error flag */
|
|
||||||
-#define SPI_STAT_TUE BIT(11) /* Transmit underflow error flag */
|
|
||||||
-#define SPI_STAT_AE BIT(10) /* Abort error flag */
|
|
||||||
-#define SPI_STAT_RE BIT(9) /* Receive error flag */
|
|
||||||
-#define SPI_STAT_TE BIT(8) /* Transmit error flag */
|
|
||||||
-#define SPI_STAT_ME BIT(7) /* Mode error flag */
|
|
||||||
-#define SPI_STAT_MS BIT(1) /* Master/slave select bit */
|
|
||||||
-#define SPI_STAT_EN BIT(0) /* Enable bit */
|
|
||||||
-#define SPI_STAT_ERRORS (SPI_STAT_ME | SPI_STAT_TE | SPI_STAT_RE | \
|
|
||||||
- SPI_STAT_AE | SPI_STAT_TUE | SPI_STAT_RUE)
|
|
||||||
-
|
|
||||||
-#define SPI_WHBSTATE_SETTUE BIT(15) /* Set transmit underflow error flag */
|
|
||||||
-#define SPI_WHBSTATE_SETAE BIT(14) /* Set abort error flag */
|
|
||||||
-#define SPI_WHBSTATE_SETRE BIT(13) /* Set receive error flag */
|
|
||||||
-#define SPI_WHBSTATE_SETTE BIT(12) /* Set transmit error flag */
|
|
||||||
-#define SPI_WHBSTATE_CLRTUE BIT(11) /* Clear transmit underflow error flag */
|
|
||||||
-#define SPI_WHBSTATE_CLRAE BIT(10) /* Clear abort error flag */
|
|
||||||
-#define SPI_WHBSTATE_CLRRE BIT(9) /* Clear receive error flag */
|
|
||||||
-#define SPI_WHBSTATE_CLRTE BIT(8) /* Clear transmit error flag */
|
|
||||||
-#define SPI_WHBSTATE_SETME BIT(7) /* Set mode error flag */
|
|
||||||
-#define SPI_WHBSTATE_CLRME BIT(6) /* Clear mode error flag */
|
|
||||||
-#define SPI_WHBSTATE_SETRUE BIT(5) /* Set receive underflow error flag */
|
|
||||||
-#define SPI_WHBSTATE_CLRRUE BIT(4) /* Clear receive underflow error flag */
|
|
||||||
-#define SPI_WHBSTATE_SETMS BIT(3) /* Set master select bit */
|
|
||||||
-#define SPI_WHBSTATE_CLRMS BIT(2) /* Clear master select bit */
|
|
||||||
-#define SPI_WHBSTATE_SETEN BIT(1) /* Set enable bit (operational mode) */
|
|
||||||
-#define SPI_WHBSTATE_CLREN BIT(0) /* Clear enable bit (config mode */
|
|
||||||
-#define SPI_WHBSTATE_CLR_ERRORS (SPI_WHBSTATE_CLRRUE | SPI_WHBSTATE_CLRME | \
|
|
||||||
- SPI_WHBSTATE_CLRTE | SPI_WHBSTATE_CLRRE | \
|
|
||||||
- SPI_WHBSTATE_CLRAE | SPI_WHBSTATE_CLRTUE)
|
|
||||||
-
|
|
||||||
-#define SPI_RXFCON_RXFITL_S 8 /* FIFO interrupt trigger level */
|
|
||||||
-#define SPI_RXFCON_RXFITL_M (0x3F << SPI_RXFCON_RXFITL_S)
|
|
||||||
-#define SPI_RXFCON_RXFLU BIT(1) /* FIFO flush */
|
|
||||||
-#define SPI_RXFCON_RXFEN BIT(0) /* FIFO enable */
|
|
||||||
-
|
|
||||||
-#define SPI_TXFCON_TXFITL_S 8 /* FIFO interrupt trigger level */
|
|
||||||
-#define SPI_TXFCON_TXFITL_M (0x3F << SPI_TXFCON_TXFITL_S)
|
|
||||||
-#define SPI_TXFCON_TXFLU BIT(1) /* FIFO flush */
|
|
||||||
-#define SPI_TXFCON_TXFEN BIT(0) /* FIFO enable */
|
|
||||||
-
|
|
||||||
-#define SPI_FSTAT_RXFFL_S 0
|
|
||||||
-#define SPI_FSTAT_RXFFL_M (0x3f << SPI_FSTAT_RXFFL_S)
|
|
||||||
-#define SPI_FSTAT_TXFFL_S 8
|
|
||||||
-#define SPI_FSTAT_TXFFL_M (0x3f << SPI_FSTAT_TXFFL_S)
|
|
||||||
-
|
|
||||||
-#define SPI_GPOCON_ISCSBN_S 8
|
|
||||||
-#define SPI_GPOCON_INVOUTN_S 0
|
|
||||||
-
|
|
||||||
-#define SPI_FGPO_SETOUTN_S 8
|
|
||||||
-#define SPI_FGPO_CLROUTN_S 0
|
|
||||||
-
|
|
||||||
-#define SPI_RXREQ_RXCNT_M 0xFFFF /* Receive count value */
|
|
||||||
-#define SPI_RXCNT_TODO_M 0xFFFF /* Recevie to-do value */
|
|
||||||
-
|
|
||||||
-#define SPI_IRNEN_TFI BIT(4) /* TX finished interrupt */
|
|
||||||
-#define SPI_IRNEN_F BIT(3) /* Frame end interrupt request */
|
|
||||||
-#define SPI_IRNEN_E BIT(2) /* Error end interrupt request */
|
|
||||||
-#define SPI_IRNEN_T_XWAY BIT(1) /* Transmit end interrupt request */
|
|
||||||
-#define SPI_IRNEN_R_XWAY BIT(0) /* Receive end interrupt request */
|
|
||||||
-#define SPI_IRNEN_R_XRX BIT(1) /* Transmit end interrupt request */
|
|
||||||
-#define SPI_IRNEN_T_XRX BIT(0) /* Receive end interrupt request */
|
|
||||||
-#define SPI_IRNEN_ALL 0x1F
|
|
||||||
+#define LTQ_SPI_RX_IRQ_NAME "spi_rx"
|
|
||||||
+#define LTQ_SPI_TX_IRQ_NAME "spi_tx"
|
|
||||||
+#define LTQ_SPI_ERR_IRQ_NAME "spi_err"
|
|
||||||
+#define LTQ_SPI_FRM_IRQ_NAME "spi_frm"
|
|
||||||
+
|
|
||||||
+#define LTQ_SPI_CLC 0x00
|
|
||||||
+#define LTQ_SPI_PISEL 0x04
|
|
||||||
+#define LTQ_SPI_ID 0x08
|
|
||||||
+#define LTQ_SPI_CON 0x10
|
|
||||||
+#define LTQ_SPI_STAT 0x14
|
|
||||||
+#define LTQ_SPI_WHBSTATE 0x18
|
|
||||||
+#define LTQ_SPI_TB 0x20
|
|
||||||
+#define LTQ_SPI_RB 0x24
|
|
||||||
+#define LTQ_SPI_RXFCON 0x30
|
|
||||||
+#define LTQ_SPI_TXFCON 0x34
|
|
||||||
+#define LTQ_SPI_FSTAT 0x38
|
|
||||||
+#define LTQ_SPI_BRT 0x40
|
|
||||||
+#define LTQ_SPI_BRSTAT 0x44
|
|
||||||
+#define LTQ_SPI_SFCON 0x60
|
|
||||||
+#define LTQ_SPI_SFSTAT 0x64
|
|
||||||
+#define LTQ_SPI_GPOCON 0x70
|
|
||||||
+#define LTQ_SPI_GPOSTAT 0x74
|
|
||||||
+#define LTQ_SPI_FPGO 0x78
|
|
||||||
+#define LTQ_SPI_RXREQ 0x80
|
|
||||||
+#define LTQ_SPI_RXCNT 0x84
|
|
||||||
+#define LTQ_SPI_DMACON 0xec
|
|
||||||
+#define LTQ_SPI_IRNEN 0xf4
|
|
||||||
+#define LTQ_SPI_IRNICR 0xf8
|
|
||||||
+#define LTQ_SPI_IRNCR 0xfc
|
|
||||||
+
|
|
||||||
+#define LTQ_SPI_CLC_SMC_S 16 /* Clock divider for sleep mode */
|
|
||||||
+#define LTQ_SPI_CLC_SMC_M (0xFF << LTQ_SPI_CLC_SMC_S)
|
|
||||||
+#define LTQ_SPI_CLC_RMC_S 8 /* Clock divider for normal run mode */
|
|
||||||
+#define LTQ_SPI_CLC_RMC_M (0xFF << LTQ_SPI_CLC_RMC_S)
|
|
||||||
+#define LTQ_SPI_CLC_DISS BIT(1) /* Disable status bit */
|
|
||||||
+#define LTQ_SPI_CLC_DISR BIT(0) /* Disable request bit */
|
|
||||||
+
|
|
||||||
+#define LTQ_SPI_ID_TXFS_S 24 /* Implemented TX FIFO size */
|
|
||||||
+#define LTQ_SPI_ID_TXFS_M (0x3F << LTQ_SPI_ID_TXFS_S)
|
|
||||||
+#define LTQ_SPI_ID_RXFS_S 16 /* Implemented RX FIFO size */
|
|
||||||
+#define LTQ_SPI_ID_RXFS_M (0x3F << LTQ_SPI_ID_RXFS_S)
|
|
||||||
+#define LTQ_SPI_ID_MOD_S 8 /* Module ID */
|
|
||||||
+#define LTQ_SPI_ID_MOD_M (0xff << LTQ_SPI_ID_MOD_S)
|
|
||||||
+#define LTQ_SPI_ID_CFG_S 5 /* DMA interface support */
|
|
||||||
+#define LTQ_SPI_ID_CFG_M (1 << LTQ_SPI_ID_CFG_S)
|
|
||||||
+#define LTQ_SPI_ID_REV_M 0x1F /* Hardware revision number */
|
|
||||||
+
|
|
||||||
+#define LTQ_SPI_CON_BM_S 16 /* Data width selection */
|
|
||||||
+#define LTQ_SPI_CON_BM_M (0x1F << LTQ_SPI_CON_BM_S)
|
|
||||||
+#define LTQ_SPI_CON_EM BIT(24) /* Echo mode */
|
|
||||||
+#define LTQ_SPI_CON_IDLE BIT(23) /* Idle bit value */
|
|
||||||
+#define LTQ_SPI_CON_ENBV BIT(22) /* Enable byte valid control */
|
|
||||||
+#define LTQ_SPI_CON_RUEN BIT(12) /* Receive underflow error enable */
|
|
||||||
+#define LTQ_SPI_CON_TUEN BIT(11) /* Transmit underflow error enable */
|
|
||||||
+#define LTQ_SPI_CON_AEN BIT(10) /* Abort error enable */
|
|
||||||
+#define LTQ_SPI_CON_REN BIT(9) /* Receive overflow error enable */
|
|
||||||
+#define LTQ_SPI_CON_TEN BIT(8) /* Transmit overflow error enable */
|
|
||||||
+#define LTQ_SPI_CON_LB BIT(7) /* Loopback control */
|
|
||||||
+#define LTQ_SPI_CON_PO BIT(6) /* Clock polarity control */
|
|
||||||
+#define LTQ_SPI_CON_PH BIT(5) /* Clock phase control */
|
|
||||||
+#define LTQ_SPI_CON_HB BIT(4) /* Heading control */
|
|
||||||
+#define LTQ_SPI_CON_RXOFF BIT(1) /* Switch receiver off */
|
|
||||||
+#define LTQ_SPI_CON_TXOFF BIT(0) /* Switch transmitter off */
|
|
||||||
+
|
|
||||||
+#define LTQ_SPI_STAT_RXBV_S 28
|
|
||||||
+#define LTQ_SPI_STAT_RXBV_M (0x7 << LTQ_SPI_STAT_RXBV_S)
|
|
||||||
+#define LTQ_SPI_STAT_BSY BIT(13) /* Busy flag */
|
|
||||||
+#define LTQ_SPI_STAT_RUE BIT(12) /* Receive underflow error flag */
|
|
||||||
+#define LTQ_SPI_STAT_TUE BIT(11) /* Transmit underflow error flag */
|
|
||||||
+#define LTQ_SPI_STAT_AE BIT(10) /* Abort error flag */
|
|
||||||
+#define LTQ_SPI_STAT_RE BIT(9) /* Receive error flag */
|
|
||||||
+#define LTQ_SPI_STAT_TE BIT(8) /* Transmit error flag */
|
|
||||||
+#define LTQ_SPI_STAT_ME BIT(7) /* Mode error flag */
|
|
||||||
+#define LTQ_SPI_STAT_MS BIT(1) /* Master/slave select bit */
|
|
||||||
+#define LTQ_SPI_STAT_EN BIT(0) /* Enable bit */
|
|
||||||
+#define LTQ_SPI_STAT_ERRORS (LTQ_SPI_STAT_ME | LTQ_SPI_STAT_TE | \
|
|
||||||
+ LTQ_SPI_STAT_RE | LTQ_SPI_STAT_AE | \
|
|
||||||
+ LTQ_SPI_STAT_TUE | LTQ_SPI_STAT_RUE)
|
|
||||||
+
|
|
||||||
+#define LTQ_SPI_WHBSTATE_SETTUE BIT(15) /* Set transmit underflow error flag */
|
|
||||||
+#define LTQ_SPI_WHBSTATE_SETAE BIT(14) /* Set abort error flag */
|
|
||||||
+#define LTQ_SPI_WHBSTATE_SETRE BIT(13) /* Set receive error flag */
|
|
||||||
+#define LTQ_SPI_WHBSTATE_SETTE BIT(12) /* Set transmit error flag */
|
|
||||||
+#define LTQ_SPI_WHBSTATE_CLRTUE BIT(11) /* Clear transmit underflow error flag */
|
|
||||||
+#define LTQ_SPI_WHBSTATE_CLRAE BIT(10) /* Clear abort error flag */
|
|
||||||
+#define LTQ_SPI_WHBSTATE_CLRRE BIT(9) /* Clear receive error flag */
|
|
||||||
+#define LTQ_SPI_WHBSTATE_CLRTE BIT(8) /* Clear transmit error flag */
|
|
||||||
+#define LTQ_SPI_WHBSTATE_SETME BIT(7) /* Set mode error flag */
|
|
||||||
+#define LTQ_SPI_WHBSTATE_CLRME BIT(6) /* Clear mode error flag */
|
|
||||||
+#define LTQ_SPI_WHBSTATE_SETRUE BIT(5) /* Set receive underflow error flag */
|
|
||||||
+#define LTQ_SPI_WHBSTATE_CLRRUE BIT(4) /* Clear receive underflow error flag */
|
|
||||||
+#define LTQ_SPI_WHBSTATE_SETMS BIT(3) /* Set master select bit */
|
|
||||||
+#define LTQ_SPI_WHBSTATE_CLRMS BIT(2) /* Clear master select bit */
|
|
||||||
+#define LTQ_SPI_WHBSTATE_SETEN BIT(1) /* Set enable bit (operational mode) */
|
|
||||||
+#define LTQ_SPI_WHBSTATE_CLREN BIT(0) /* Clear enable bit (config mode */
|
|
||||||
+#define LTQ_SPI_WHBSTATE_CLR_ERRORS (LTQ_SPI_WHBSTATE_CLRRUE | \
|
|
||||||
+ LTQ_SPI_WHBSTATE_CLRME | \
|
|
||||||
+ LTQ_SPI_WHBSTATE_CLRTE | \
|
|
||||||
+ LTQ_SPI_WHBSTATE_CLRRE | \
|
|
||||||
+ LTQ_SPI_WHBSTATE_CLRAE | \
|
|
||||||
+ LTQ_SPI_WHBSTATE_CLRTUE)
|
|
||||||
+
|
|
||||||
+#define LTQ_SPI_RXFCON_RXFITL_S 8 /* FIFO interrupt trigger level */
|
|
||||||
+#define LTQ_SPI_RXFCON_RXFITL_M (0x3F << LTQ_SPI_RXFCON_RXFITL_S)
|
|
||||||
+#define LTQ_SPI_RXFCON_RXFLU BIT(1) /* FIFO flush */
|
|
||||||
+#define LTQ_SPI_RXFCON_RXFEN BIT(0) /* FIFO enable */
|
|
||||||
+
|
|
||||||
+#define LTQ_SPI_TXFCON_TXFITL_S 8 /* FIFO interrupt trigger level */
|
|
||||||
+#define LTQ_SPI_TXFCON_TXFITL_M (0x3F << LTQ_SPI_TXFCON_TXFITL_S)
|
|
||||||
+#define LTQ_SPI_TXFCON_TXFLU BIT(1) /* FIFO flush */
|
|
||||||
+#define LTQ_SPI_TXFCON_TXFEN BIT(0) /* FIFO enable */
|
|
||||||
+
|
|
||||||
+#define LTQ_SPI_FSTAT_RXFFL_S 0
|
|
||||||
+#define LTQ_SPI_FSTAT_RXFFL_M (0x3f << LTQ_SPI_FSTAT_RXFFL_S)
|
|
||||||
+#define LTQ_SPI_FSTAT_TXFFL_S 8
|
|
||||||
+#define LTQ_SPI_FSTAT_TXFFL_M (0x3f << LTQ_SPI_FSTAT_TXFFL_S)
|
|
||||||
+
|
|
||||||
+#define LTQ_SPI_GPOCON_ISCSBN_S 8
|
|
||||||
+#define LTQ_SPI_GPOCON_INVOUTN_S 0
|
|
||||||
+
|
|
||||||
+#define LTQ_SPI_FGPO_SETOUTN_S 8
|
|
||||||
+#define LTQ_SPI_FGPO_CLROUTN_S 0
|
|
||||||
+
|
|
||||||
+#define LTQ_SPI_RXREQ_RXCNT_M 0xFFFF /* Receive count value */
|
|
||||||
+#define LTQ_SPI_RXCNT_TODO_M 0xFFFF /* Recevie to-do value */
|
|
||||||
+
|
|
||||||
+#define LTQ_SPI_IRNEN_TFI BIT(4) /* TX finished interrupt */
|
|
||||||
+#define LTQ_SPI_IRNEN_F BIT(3) /* Frame end interrupt request */
|
|
||||||
+#define LTQ_SPI_IRNEN_E BIT(2) /* Error end interrupt request */
|
|
||||||
+#define LTQ_SPI_IRNEN_T_XWAY BIT(1) /* Transmit end interrupt request */
|
|
||||||
+#define LTQ_SPI_IRNEN_R_XWAY BIT(0) /* Receive end interrupt request */
|
|
||||||
+#define LTQ_SPI_IRNEN_R_XRX BIT(1) /* Transmit end interrupt request */
|
|
||||||
+#define LTQ_SPI_IRNEN_T_XRX BIT(0) /* Receive end interrupt request */
|
|
||||||
+#define LTQ_SPI_IRNEN_ALL 0x1F
|
|
||||||
|
|
||||||
struct lantiq_ssc_hwcfg {
|
|
||||||
unsigned int irnen_r;
|
|
||||||
@@ -208,16 +212,16 @@ static void lantiq_ssc_maskl(const struc
|
|
||||||
|
|
||||||
static unsigned int tx_fifo_level(const struct lantiq_ssc_spi *spi)
|
|
||||||
{
|
|
||||||
- u32 fstat = lantiq_ssc_readl(spi, SPI_FSTAT);
|
|
||||||
+ u32 fstat = lantiq_ssc_readl(spi, LTQ_SPI_FSTAT);
|
|
||||||
|
|
||||||
- return (fstat & SPI_FSTAT_TXFFL_M) >> SPI_FSTAT_TXFFL_S;
|
|
||||||
+ return (fstat & LTQ_SPI_FSTAT_TXFFL_M) >> LTQ_SPI_FSTAT_TXFFL_S;
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned int rx_fifo_level(const struct lantiq_ssc_spi *spi)
|
|
||||||
{
|
|
||||||
- u32 fstat = lantiq_ssc_readl(spi, SPI_FSTAT);
|
|
||||||
+ u32 fstat = lantiq_ssc_readl(spi, LTQ_SPI_FSTAT);
|
|
||||||
|
|
||||||
- return fstat & SPI_FSTAT_RXFFL_M;
|
|
||||||
+ return fstat & LTQ_SPI_FSTAT_RXFFL_M;
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned int tx_fifo_free(const struct lantiq_ssc_spi *spi)
|
|
||||||
@@ -227,38 +231,38 @@ static unsigned int tx_fifo_free(const s
|
|
||||||
|
|
||||||
static void rx_fifo_reset(const struct lantiq_ssc_spi *spi)
|
|
||||||
{
|
|
||||||
- u32 val = spi->rx_fifo_size << SPI_RXFCON_RXFITL_S;
|
|
||||||
+ u32 val = spi->rx_fifo_size << LTQ_SPI_RXFCON_RXFITL_S;
|
|
||||||
|
|
||||||
- val |= SPI_RXFCON_RXFEN | SPI_RXFCON_RXFLU;
|
|
||||||
- lantiq_ssc_writel(spi, val, SPI_RXFCON);
|
|
||||||
+ val |= LTQ_SPI_RXFCON_RXFEN | LTQ_SPI_RXFCON_RXFLU;
|
|
||||||
+ lantiq_ssc_writel(spi, val, LTQ_SPI_RXFCON);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void tx_fifo_reset(const struct lantiq_ssc_spi *spi)
|
|
||||||
{
|
|
||||||
- u32 val = 1 << SPI_TXFCON_TXFITL_S;
|
|
||||||
+ u32 val = 1 << LTQ_SPI_TXFCON_TXFITL_S;
|
|
||||||
|
|
||||||
- val |= SPI_TXFCON_TXFEN | SPI_TXFCON_TXFLU;
|
|
||||||
- lantiq_ssc_writel(spi, val, SPI_TXFCON);
|
|
||||||
+ val |= LTQ_SPI_TXFCON_TXFEN | LTQ_SPI_TXFCON_TXFLU;
|
|
||||||
+ lantiq_ssc_writel(spi, val, LTQ_SPI_TXFCON);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void rx_fifo_flush(const struct lantiq_ssc_spi *spi)
|
|
||||||
{
|
|
||||||
- lantiq_ssc_maskl(spi, 0, SPI_RXFCON_RXFLU, SPI_RXFCON);
|
|
||||||
+ lantiq_ssc_maskl(spi, 0, LTQ_SPI_RXFCON_RXFLU, LTQ_SPI_RXFCON);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void tx_fifo_flush(const struct lantiq_ssc_spi *spi)
|
|
||||||
{
|
|
||||||
- lantiq_ssc_maskl(spi, 0, SPI_TXFCON_TXFLU, SPI_TXFCON);
|
|
||||||
+ lantiq_ssc_maskl(spi, 0, LTQ_SPI_TXFCON_TXFLU, LTQ_SPI_TXFCON);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void hw_enter_config_mode(const struct lantiq_ssc_spi *spi)
|
|
||||||
{
|
|
||||||
- lantiq_ssc_writel(spi, SPI_WHBSTATE_CLREN, SPI_WHBSTATE);
|
|
||||||
+ lantiq_ssc_writel(spi, LTQ_SPI_WHBSTATE_CLREN, LTQ_SPI_WHBSTATE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void hw_enter_active_mode(const struct lantiq_ssc_spi *spi)
|
|
||||||
{
|
|
||||||
- lantiq_ssc_writel(spi, SPI_WHBSTATE_SETEN, SPI_WHBSTATE);
|
|
||||||
+ lantiq_ssc_writel(spi, LTQ_SPI_WHBSTATE_SETEN, LTQ_SPI_WHBSTATE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void hw_setup_speed_hz(const struct lantiq_ssc_spi *spi,
|
|
||||||
@@ -287,7 +291,7 @@ static void hw_setup_speed_hz(const stru
|
|
||||||
dev_dbg(spi->dev, "spi_clk %u, max_speed_hz %u, brt %u\n",
|
|
||||||
spi_clk, max_speed_hz, brt);
|
|
||||||
|
|
||||||
- lantiq_ssc_writel(spi, brt, SPI_BRT);
|
|
||||||
+ lantiq_ssc_writel(spi, brt, LTQ_SPI_BRT);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void hw_setup_bits_per_word(const struct lantiq_ssc_spi *spi,
|
|
||||||
@@ -296,9 +300,9 @@ static void hw_setup_bits_per_word(const
|
|
||||||
u32 bm;
|
|
||||||
|
|
||||||
/* CON.BM value = bits_per_word - 1 */
|
|
||||||
- bm = (bits_per_word - 1) << SPI_CON_BM_S;
|
|
||||||
+ bm = (bits_per_word - 1) << LTQ_SPI_CON_BM_S;
|
|
||||||
|
|
||||||
- lantiq_ssc_maskl(spi, SPI_CON_BM_M, bm, SPI_CON);
|
|
||||||
+ lantiq_ssc_maskl(spi, LTQ_SPI_CON_BM_M, bm, LTQ_SPI_CON);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void hw_setup_clock_mode(const struct lantiq_ssc_spi *spi,
|
|
||||||
@@ -315,28 +319,28 @@ static void hw_setup_clock_mode(const st
|
|
||||||
* 3 1 1 1 0
|
|
||||||
*/
|
|
||||||
if (mode & SPI_CPHA)
|
|
||||||
- con_clr |= SPI_CON_PH;
|
|
||||||
+ con_clr |= LTQ_SPI_CON_PH;
|
|
||||||
else
|
|
||||||
- con_set |= SPI_CON_PH;
|
|
||||||
+ con_set |= LTQ_SPI_CON_PH;
|
|
||||||
|
|
||||||
if (mode & SPI_CPOL)
|
|
||||||
- con_set |= SPI_CON_PO | SPI_CON_IDLE;
|
|
||||||
+ con_set |= LTQ_SPI_CON_PO | LTQ_SPI_CON_IDLE;
|
|
||||||
else
|
|
||||||
- con_clr |= SPI_CON_PO | SPI_CON_IDLE;
|
|
||||||
+ con_clr |= LTQ_SPI_CON_PO | LTQ_SPI_CON_IDLE;
|
|
||||||
|
|
||||||
/* Set heading control */
|
|
||||||
if (mode & SPI_LSB_FIRST)
|
|
||||||
- con_clr |= SPI_CON_HB;
|
|
||||||
+ con_clr |= LTQ_SPI_CON_HB;
|
|
||||||
else
|
|
||||||
- con_set |= SPI_CON_HB;
|
|
||||||
+ con_set |= LTQ_SPI_CON_HB;
|
|
||||||
|
|
||||||
/* Set loopback mode */
|
|
||||||
if (mode & SPI_LOOP)
|
|
||||||
- con_set |= SPI_CON_LB;
|
|
||||||
+ con_set |= LTQ_SPI_CON_LB;
|
|
||||||
else
|
|
||||||
- con_clr |= SPI_CON_LB;
|
|
||||||
+ con_clr |= LTQ_SPI_CON_LB;
|
|
||||||
|
|
||||||
- lantiq_ssc_maskl(spi, con_clr, con_set, SPI_CON);
|
|
||||||
+ lantiq_ssc_maskl(spi, con_clr, con_set, LTQ_SPI_CON);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void lantiq_ssc_hw_init(const struct lantiq_ssc_spi *spi)
|
|
||||||
@@ -347,37 +351,39 @@ static void lantiq_ssc_hw_init(const str
|
|
||||||
* Set clock divider for run mode to 1 to
|
|
||||||
* run at same frequency as FPI bus
|
|
||||||
*/
|
|
||||||
- lantiq_ssc_writel(spi, 1 << SPI_CLC_RMC_S, SPI_CLC);
|
|
||||||
+ lantiq_ssc_writel(spi, 1 << LTQ_SPI_CLC_RMC_S, LTQ_SPI_CLC);
|
|
||||||
|
|
||||||
/* Put controller into config mode */
|
|
||||||
hw_enter_config_mode(spi);
|
|
||||||
|
|
||||||
/* Clear error flags */
|
|
||||||
- lantiq_ssc_maskl(spi, 0, SPI_WHBSTATE_CLR_ERRORS, SPI_WHBSTATE);
|
|
||||||
+ lantiq_ssc_maskl(spi, 0, LTQ_SPI_WHBSTATE_CLR_ERRORS, LTQ_SPI_WHBSTATE);
|
|
||||||
|
|
||||||
/* Enable error checking, disable TX/RX */
|
|
||||||
- lantiq_ssc_writel(spi, SPI_CON_RUEN | SPI_CON_AEN | SPI_CON_TEN |
|
|
||||||
- SPI_CON_REN | SPI_CON_TXOFF | SPI_CON_RXOFF, SPI_CON);
|
|
||||||
+ lantiq_ssc_writel(spi, LTQ_SPI_CON_RUEN | LTQ_SPI_CON_AEN |
|
|
||||||
+ LTQ_SPI_CON_TEN | LTQ_SPI_CON_REN | LTQ_SPI_CON_TXOFF |
|
|
||||||
+ LTQ_SPI_CON_RXOFF, LTQ_SPI_CON);
|
|
||||||
|
|
||||||
/* Setup default SPI mode */
|
|
||||||
hw_setup_bits_per_word(spi, spi->bits_per_word);
|
|
||||||
hw_setup_clock_mode(spi, SPI_MODE_0);
|
|
||||||
|
|
||||||
/* Enable master mode and clear error flags */
|
|
||||||
- lantiq_ssc_writel(spi, SPI_WHBSTATE_SETMS | SPI_WHBSTATE_CLR_ERRORS,
|
|
||||||
- SPI_WHBSTATE);
|
|
||||||
+ lantiq_ssc_writel(spi, LTQ_SPI_WHBSTATE_SETMS |
|
|
||||||
+ LTQ_SPI_WHBSTATE_CLR_ERRORS,
|
|
||||||
+ LTQ_SPI_WHBSTATE);
|
|
||||||
|
|
||||||
/* Reset GPIO/CS registers */
|
|
||||||
- lantiq_ssc_writel(spi, 0, SPI_GPOCON);
|
|
||||||
- lantiq_ssc_writel(spi, 0xFF00, SPI_FPGO);
|
|
||||||
+ lantiq_ssc_writel(spi, 0, LTQ_SPI_GPOCON);
|
|
||||||
+ lantiq_ssc_writel(spi, 0xFF00, LTQ_SPI_FPGO);
|
|
||||||
|
|
||||||
/* Enable and flush FIFOs */
|
|
||||||
rx_fifo_reset(spi);
|
|
||||||
tx_fifo_reset(spi);
|
|
||||||
|
|
||||||
/* Enable interrupts */
|
|
||||||
- lantiq_ssc_writel(spi, hwcfg->irnen_t | hwcfg->irnen_r | SPI_IRNEN_E,
|
|
||||||
- SPI_IRNEN);
|
|
||||||
+ lantiq_ssc_writel(spi, hwcfg->irnen_t | hwcfg->irnen_r |
|
|
||||||
+ LTQ_SPI_IRNEN_E, LTQ_SPI_IRNEN);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int lantiq_ssc_setup(struct spi_device *spidev)
|
|
||||||
@@ -400,13 +406,13 @@ static int lantiq_ssc_setup(struct spi_d
|
|
||||||
}
|
|
||||||
|
|
||||||
/* set GPO pin to CS mode */
|
|
||||||
- gpocon = 1 << ((cs - spi->base_cs) + SPI_GPOCON_ISCSBN_S);
|
|
||||||
+ gpocon = 1 << ((cs - spi->base_cs) + LTQ_SPI_GPOCON_ISCSBN_S);
|
|
||||||
|
|
||||||
/* invert GPO pin */
|
|
||||||
if (spidev->mode & SPI_CS_HIGH)
|
|
||||||
gpocon |= 1 << (cs - spi->base_cs);
|
|
||||||
|
|
||||||
- lantiq_ssc_maskl(spi, 0, gpocon, SPI_GPOCON);
|
|
||||||
+ lantiq_ssc_maskl(spi, 0, gpocon, LTQ_SPI_GPOCON);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -442,18 +448,18 @@ static void hw_setup_transfer(struct lan
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Configure transmitter and receiver */
|
|
||||||
- con = lantiq_ssc_readl(spi, SPI_CON);
|
|
||||||
+ con = lantiq_ssc_readl(spi, LTQ_SPI_CON);
|
|
||||||
if (t->tx_buf)
|
|
||||||
- con &= ~SPI_CON_TXOFF;
|
|
||||||
+ con &= ~LTQ_SPI_CON_TXOFF;
|
|
||||||
else
|
|
||||||
- con |= SPI_CON_TXOFF;
|
|
||||||
+ con |= LTQ_SPI_CON_TXOFF;
|
|
||||||
|
|
||||||
if (t->rx_buf)
|
|
||||||
- con &= ~SPI_CON_RXOFF;
|
|
||||||
+ con &= ~LTQ_SPI_CON_RXOFF;
|
|
||||||
else
|
|
||||||
- con |= SPI_CON_RXOFF;
|
|
||||||
+ con |= LTQ_SPI_CON_RXOFF;
|
|
||||||
|
|
||||||
- lantiq_ssc_writel(spi, con, SPI_CON);
|
|
||||||
+ lantiq_ssc_writel(spi, con, LTQ_SPI_CON);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int lantiq_ssc_unprepare_message(struct spi_master *master,
|
|
||||||
@@ -464,7 +470,8 @@ static int lantiq_ssc_unprepare_message(
|
|
||||||
flush_workqueue(spi->wq);
|
|
||||||
|
|
||||||
/* Disable transmitter and receiver while idle */
|
|
||||||
- lantiq_ssc_maskl(spi, 0, SPI_CON_TXOFF | SPI_CON_RXOFF, SPI_CON);
|
|
||||||
+ lantiq_ssc_maskl(spi, 0, LTQ_SPI_CON_TXOFF | LTQ_SPI_CON_RXOFF,
|
|
||||||
+ LTQ_SPI_CON);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -503,7 +510,7 @@ static void tx_fifo_write(struct lantiq_
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
- lantiq_ssc_writel(spi, data, SPI_TB);
|
|
||||||
+ lantiq_ssc_writel(spi, data, LTQ_SPI_TB);
|
|
||||||
tx_free--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -517,7 +524,7 @@ static void rx_fifo_read_full_duplex(str
|
|
||||||
unsigned int rx_fill = rx_fifo_level(spi);
|
|
||||||
|
|
||||||
while (rx_fill) {
|
|
||||||
- data = lantiq_ssc_readl(spi, SPI_RB);
|
|
||||||
+ data = lantiq_ssc_readl(spi, LTQ_SPI_RB);
|
|
||||||
|
|
||||||
switch (spi->bits_per_word) {
|
|
||||||
case 2 ... 8:
|
|
||||||
@@ -563,9 +570,9 @@ static void rx_fifo_read_half_duplex(str
|
|
||||||
*/
|
|
||||||
while (rx_fill) {
|
|
||||||
if (spi->rx_todo < 4) {
|
|
||||||
- rxbv = (lantiq_ssc_readl(spi, SPI_STAT) &
|
|
||||||
- SPI_STAT_RXBV_M) >> SPI_STAT_RXBV_S;
|
|
||||||
- data = lantiq_ssc_readl(spi, SPI_RB);
|
|
||||||
+ rxbv = (lantiq_ssc_readl(spi, LTQ_SPI_STAT) &
|
|
||||||
+ LTQ_SPI_STAT_RXBV_M) >> LTQ_SPI_STAT_RXBV_S;
|
|
||||||
+ data = lantiq_ssc_readl(spi, LTQ_SPI_RB);
|
|
||||||
|
|
||||||
shift = (rxbv - 1) * 8;
|
|
||||||
rx8 = spi->rx;
|
|
||||||
@@ -578,7 +585,7 @@ static void rx_fifo_read_half_duplex(str
|
|
||||||
spi->rx++;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
- data = lantiq_ssc_readl(spi, SPI_RB);
|
|
||||||
+ data = lantiq_ssc_readl(spi, LTQ_SPI_RB);
|
|
||||||
rx32 = (u32 *) spi->rx;
|
|
||||||
|
|
||||||
*rx32++ = data;
|
|
||||||
@@ -603,7 +610,7 @@ static void rx_request(struct lantiq_ssc
|
|
||||||
if (rxreq > rxreq_max)
|
|
||||||
rxreq = rxreq_max;
|
|
||||||
|
|
||||||
- lantiq_ssc_writel(spi, rxreq, SPI_RXREQ);
|
|
||||||
+ lantiq_ssc_writel(spi, rxreq, LTQ_SPI_RXREQ);
|
|
||||||
}
|
|
||||||
|
|
||||||
static irqreturn_t lantiq_ssc_xmit_interrupt(int irq, void *data)
|
|
||||||
@@ -642,26 +649,26 @@ completed:
|
|
||||||
static irqreturn_t lantiq_ssc_err_interrupt(int irq, void *data)
|
|
||||||
{
|
|
||||||
struct lantiq_ssc_spi *spi = data;
|
|
||||||
- u32 stat = lantiq_ssc_readl(spi, SPI_STAT);
|
|
||||||
+ u32 stat = lantiq_ssc_readl(spi, LTQ_SPI_STAT);
|
|
||||||
|
|
||||||
- if (!(stat & SPI_STAT_ERRORS))
|
|
||||||
+ if (!(stat & LTQ_SPI_STAT_ERRORS))
|
|
||||||
return IRQ_NONE;
|
|
||||||
|
|
||||||
- if (stat & SPI_STAT_RUE)
|
|
||||||
+ if (stat & LTQ_SPI_STAT_RUE)
|
|
||||||
dev_err(spi->dev, "receive underflow error\n");
|
|
||||||
- if (stat & SPI_STAT_TUE)
|
|
||||||
+ if (stat & LTQ_SPI_STAT_TUE)
|
|
||||||
dev_err(spi->dev, "transmit underflow error\n");
|
|
||||||
- if (stat & SPI_STAT_AE)
|
|
||||||
+ if (stat & LTQ_SPI_STAT_AE)
|
|
||||||
dev_err(spi->dev, "abort error\n");
|
|
||||||
- if (stat & SPI_STAT_RE)
|
|
||||||
+ if (stat & LTQ_SPI_STAT_RE)
|
|
||||||
dev_err(spi->dev, "receive overflow error\n");
|
|
||||||
- if (stat & SPI_STAT_TE)
|
|
||||||
+ if (stat & LTQ_SPI_STAT_TE)
|
|
||||||
dev_err(spi->dev, "transmit overflow error\n");
|
|
||||||
- if (stat & SPI_STAT_ME)
|
|
||||||
+ if (stat & LTQ_SPI_STAT_ME)
|
|
||||||
dev_err(spi->dev, "mode error\n");
|
|
||||||
|
|
||||||
/* Clear error flags */
|
|
||||||
- lantiq_ssc_maskl(spi, 0, SPI_WHBSTATE_CLR_ERRORS, SPI_WHBSTATE);
|
|
||||||
+ lantiq_ssc_maskl(spi, 0, LTQ_SPI_WHBSTATE_CLR_ERRORS, LTQ_SPI_WHBSTATE);
|
|
||||||
|
|
||||||
/* set bad status so it can be retried */
|
|
||||||
if (spi->master->cur_msg)
|
|
||||||
@@ -721,9 +728,9 @@ static void lantiq_ssc_bussy_work(struct
|
|
||||||
|
|
||||||
end = jiffies + msecs_to_jiffies(timeout);
|
|
||||||
do {
|
|
||||||
- u32 stat = lantiq_ssc_readl(spi, SPI_STAT);
|
|
||||||
+ u32 stat = lantiq_ssc_readl(spi, LTQ_SPI_STAT);
|
|
||||||
|
|
||||||
- if (!(stat & SPI_STAT_BSY)) {
|
|
||||||
+ if (!(stat & LTQ_SPI_STAT_BSY)) {
|
|
||||||
spi_finalize_current_transfer(spi->master);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
@@ -755,9 +762,9 @@ static void lantiq_ssc_set_cs(struct spi
|
|
||||||
if (!!(spidev->mode & SPI_CS_HIGH) == enable)
|
|
||||||
fgpo = (1 << (cs - spi->base_cs));
|
|
||||||
else
|
|
||||||
- fgpo = (1 << (cs - spi->base_cs + SPI_FGPO_SETOUTN_S));
|
|
||||||
+ fgpo = (1 << (cs - spi->base_cs + LTQ_SPI_FGPO_SETOUTN_S));
|
|
||||||
|
|
||||||
- lantiq_ssc_writel(spi, fgpo, SPI_FPGO);
|
|
||||||
+ lantiq_ssc_writel(spi, fgpo, LTQ_SPI_FPGO);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int lantiq_ssc_transfer_one(struct spi_master *master,
|
|
||||||
@@ -772,13 +779,13 @@ static int lantiq_ssc_transfer_one(struc
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct lantiq_ssc_hwcfg lantiq_ssc_xway = {
|
|
||||||
- .irnen_r = SPI_IRNEN_R_XWAY,
|
|
||||||
- .irnen_t = SPI_IRNEN_T_XWAY,
|
|
||||||
+ .irnen_r = LTQ_SPI_IRNEN_R_XWAY,
|
|
||||||
+ .irnen_t = LTQ_SPI_IRNEN_T_XWAY,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct lantiq_ssc_hwcfg lantiq_ssc_xrx = {
|
|
||||||
- .irnen_r = SPI_IRNEN_R_XRX,
|
|
||||||
- .irnen_t = SPI_IRNEN_T_XRX,
|
|
||||||
+ .irnen_r = LTQ_SPI_IRNEN_R_XRX,
|
|
||||||
+ .irnen_t = LTQ_SPI_IRNEN_T_XRX,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct of_device_id lantiq_ssc_match[] = {
|
|
||||||
@@ -814,21 +821,21 @@ static int lantiq_ssc_probe(struct platf
|
|
||||||
return -ENXIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
- rx_irq = platform_get_irq_byname(pdev, SPI_RX_IRQ_NAME);
|
|
||||||
+ rx_irq = platform_get_irq_byname(pdev, LTQ_SPI_RX_IRQ_NAME);
|
|
||||||
if (rx_irq < 0) {
|
|
||||||
- dev_err(dev, "failed to get %s\n", SPI_RX_IRQ_NAME);
|
|
||||||
+ dev_err(dev, "failed to get %s\n", LTQ_SPI_RX_IRQ_NAME);
|
|
||||||
return -ENXIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
- tx_irq = platform_get_irq_byname(pdev, SPI_TX_IRQ_NAME);
|
|
||||||
+ tx_irq = platform_get_irq_byname(pdev, LTQ_SPI_TX_IRQ_NAME);
|
|
||||||
if (tx_irq < 0) {
|
|
||||||
- dev_err(dev, "failed to get %s\n", SPI_TX_IRQ_NAME);
|
|
||||||
+ dev_err(dev, "failed to get %s\n", LTQ_SPI_TX_IRQ_NAME);
|
|
||||||
return -ENXIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
- err_irq = platform_get_irq_byname(pdev, SPI_ERR_IRQ_NAME);
|
|
||||||
+ err_irq = platform_get_irq_byname(pdev, LTQ_SPI_ERR_IRQ_NAME);
|
|
||||||
if (err_irq < 0) {
|
|
||||||
- dev_err(dev, "failed to get %s\n", SPI_ERR_IRQ_NAME);
|
|
||||||
+ dev_err(dev, "failed to get %s\n", LTQ_SPI_ERR_IRQ_NAME);
|
|
||||||
return -ENXIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -849,17 +856,17 @@ static int lantiq_ssc_probe(struct platf
|
|
||||||
}
|
|
||||||
|
|
||||||
err = devm_request_irq(dev, rx_irq, lantiq_ssc_xmit_interrupt,
|
|
||||||
- 0, SPI_RX_IRQ_NAME, spi);
|
|
||||||
+ 0, LTQ_SPI_RX_IRQ_NAME, spi);
|
|
||||||
if (err)
|
|
||||||
goto err_master_put;
|
|
||||||
|
|
||||||
err = devm_request_irq(dev, tx_irq, lantiq_ssc_xmit_interrupt,
|
|
||||||
- 0, SPI_TX_IRQ_NAME, spi);
|
|
||||||
+ 0, LTQ_SPI_TX_IRQ_NAME, spi);
|
|
||||||
if (err)
|
|
||||||
goto err_master_put;
|
|
||||||
|
|
||||||
err = devm_request_irq(dev, err_irq, lantiq_ssc_err_interrupt,
|
|
||||||
- 0, SPI_ERR_IRQ_NAME, spi);
|
|
||||||
+ 0, LTQ_SPI_ERR_IRQ_NAME, spi);
|
|
||||||
if (err)
|
|
||||||
goto err_master_put;
|
|
||||||
|
|
||||||
@@ -916,11 +923,11 @@ static int lantiq_ssc_probe(struct platf
|
|
||||||
}
|
|
||||||
INIT_WORK(&spi->work, lantiq_ssc_bussy_work);
|
|
||||||
|
|
||||||
- id = lantiq_ssc_readl(spi, SPI_ID);
|
|
||||||
- spi->tx_fifo_size = (id & SPI_ID_TXFS_M) >> SPI_ID_TXFS_S;
|
|
||||||
- spi->rx_fifo_size = (id & SPI_ID_RXFS_M) >> SPI_ID_RXFS_S;
|
|
||||||
- supports_dma = (id & SPI_ID_CFG_M) >> SPI_ID_CFG_S;
|
|
||||||
- revision = id & SPI_ID_REV_M;
|
|
||||||
+ id = lantiq_ssc_readl(spi, LTQ_SPI_ID);
|
|
||||||
+ spi->tx_fifo_size = (id & LTQ_SPI_ID_TXFS_M) >> LTQ_SPI_ID_TXFS_S;
|
|
||||||
+ spi->rx_fifo_size = (id & LTQ_SPI_ID_RXFS_M) >> LTQ_SPI_ID_RXFS_S;
|
|
||||||
+ supports_dma = (id & LTQ_SPI_ID_CFG_M) >> LTQ_SPI_ID_CFG_S;
|
|
||||||
+ revision = id & LTQ_SPI_ID_REV_M;
|
|
||||||
|
|
||||||
lantiq_ssc_hw_init(spi);
|
|
||||||
|
|
||||||
@@ -952,8 +959,8 @@ static int lantiq_ssc_remove(struct plat
|
|
||||||
{
|
|
||||||
struct lantiq_ssc_spi *spi = platform_get_drvdata(pdev);
|
|
||||||
|
|
||||||
- lantiq_ssc_writel(spi, 0, SPI_IRNEN);
|
|
||||||
- lantiq_ssc_writel(spi, 0, SPI_CLC);
|
|
||||||
+ lantiq_ssc_writel(spi, 0, LTQ_SPI_IRNEN);
|
|
||||||
+ lantiq_ssc_writel(spi, 0, LTQ_SPI_CLC);
|
|
||||||
rx_fifo_flush(spi);
|
|
||||||
tx_fifo_flush(spi);
|
|
||||||
hw_enter_config_mode(spi);
|
|
@ -1,6 +1,6 @@
|
|||||||
--- a/arch/mips/Kconfig
|
--- a/arch/mips/Kconfig
|
||||||
+++ b/arch/mips/Kconfig
|
+++ b/arch/mips/Kconfig
|
||||||
@@ -2320,6 +2320,12 @@ config MIPS_VPE_LOADER
|
@@ -2323,6 +2323,12 @@ config MIPS_VPE_LOADER
|
||||||
Includes a loader for loading an elf relocatable object
|
Includes a loader for loading an elf relocatable object
|
||||||
onto another VPE and running it.
|
onto another VPE and running it.
|
||||||
|
|
||||||
@ -142,7 +142,7 @@
|
|||||||
{
|
{
|
||||||
--- a/arch/mips/lantiq/prom.c
|
--- a/arch/mips/lantiq/prom.c
|
||||||
+++ b/arch/mips/lantiq/prom.c
|
+++ b/arch/mips/lantiq/prom.c
|
||||||
@@ -31,10 +31,14 @@ EXPORT_SYMBOL_GPL(ebu_lock);
|
@@ -37,10 +37,14 @@ unsigned long physical_memsize = 0L;
|
||||||
*/
|
*/
|
||||||
static struct ltq_soc_info soc_info;
|
static struct ltq_soc_info soc_info;
|
||||||
|
|
||||||
@ -159,7 +159,7 @@
|
|||||||
{
|
{
|
||||||
--- a/arch/mips/include/asm/mipsmtregs.h
|
--- a/arch/mips/include/asm/mipsmtregs.h
|
||||||
+++ b/arch/mips/include/asm/mipsmtregs.h
|
+++ b/arch/mips/include/asm/mipsmtregs.h
|
||||||
@@ -31,6 +31,9 @@
|
@@ -32,6 +32,9 @@
|
||||||
#define read_c0_vpeconf1() __read_32bit_c0_register($1, 3)
|
#define read_c0_vpeconf1() __read_32bit_c0_register($1, 3)
|
||||||
#define write_c0_vpeconf1(val) __write_32bit_c0_register($1, 3, val)
|
#define write_c0_vpeconf1(val) __write_32bit_c0_register($1, 3, val)
|
||||||
|
|
||||||
@ -169,7 +169,7 @@
|
|||||||
#define read_c0_tcstatus() __read_32bit_c0_register($2, 1)
|
#define read_c0_tcstatus() __read_32bit_c0_register($2, 1)
|
||||||
#define write_c0_tcstatus(val) __write_32bit_c0_register($2, 1, val)
|
#define write_c0_tcstatus(val) __write_32bit_c0_register($2, 1, val)
|
||||||
|
|
||||||
@@ -376,6 +379,8 @@ do { \
|
@@ -377,6 +380,8 @@ do { \
|
||||||
#define write_vpe_c0_vpeconf0(val) mttc0(1, 2, val)
|
#define write_vpe_c0_vpeconf0(val) mttc0(1, 2, val)
|
||||||
#define read_vpe_c0_vpeconf1() mftc0(1, 3)
|
#define read_vpe_c0_vpeconf1() mftc0(1, 3)
|
||||||
#define write_vpe_c0_vpeconf1(val) mttc0(1, 3, val)
|
#define write_vpe_c0_vpeconf1(val) mttc0(1, 3, val)
|
||||||
|
@ -71,9 +71,9 @@
|
|||||||
+ };
|
+ };
|
||||||
+ const char **type;
|
+ const char **type;
|
||||||
|
|
||||||
if (of_machine_is_compatible("lantiq,falcon") &&
|
ltq_mtd = devm_kzalloc(&pdev->dev, sizeof(struct ltq_mtd), GFP_KERNEL);
|
||||||
(ltq_boot_select() != BS_FLASH)) {
|
if (!ltq_mtd)
|
||||||
@@ -126,75 +162,89 @@ ltq_mtd_probe(struct platform_device *pd
|
@@ -120,75 +156,89 @@ ltq_mtd_probe(struct platform_device *pd
|
||||||
|
|
||||||
platform_set_drvdata(pdev, ltq_mtd);
|
platform_set_drvdata(pdev, ltq_mtd);
|
||||||
|
|
||||||
@ -141,17 +141,7 @@
|
|||||||
- GFP_KERNEL);
|
- GFP_KERNEL);
|
||||||
- if (!ltq_mtd->map)
|
- if (!ltq_mtd->map)
|
||||||
- return -ENOMEM;
|
- return -ENOMEM;
|
||||||
+ if (devices_found == 1) {
|
-
|
||||||
+ ltq_mtd->cmtd = ltq_mtd->mtd[0];
|
|
||||||
+ } else if (devices_found > 1) {
|
|
||||||
+ /*
|
|
||||||
+ * We detected multiple devices. Concatenate them together.
|
|
||||||
+ */
|
|
||||||
+ ltq_mtd->cmtd = mtd_concat_create(ltq_mtd->mtd, devices_found, dev_name(&pdev->dev));
|
|
||||||
+ if (ltq_mtd->cmtd == NULL)
|
|
||||||
+ err = -ENXIO;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
- if (of_find_property(pdev->dev.of_node, "lantiq,noxip", NULL))
|
- if (of_find_property(pdev->dev.of_node, "lantiq,noxip", NULL))
|
||||||
- ltq_mtd->map->phys = NO_XIP;
|
- ltq_mtd->map->phys = NO_XIP;
|
||||||
- else
|
- else
|
||||||
@ -176,8 +166,17 @@
|
|||||||
- if (!ltq_mtd->mtd) {
|
- if (!ltq_mtd->mtd) {
|
||||||
- dev_err(&pdev->dev, "probing failed\n");
|
- dev_err(&pdev->dev, "probing failed\n");
|
||||||
- return -ENXIO;
|
- return -ENXIO;
|
||||||
- }
|
+ if (devices_found == 1) {
|
||||||
-
|
+ ltq_mtd->cmtd = ltq_mtd->mtd[0];
|
||||||
|
+ } else if (devices_found > 1) {
|
||||||
|
+ /*
|
||||||
|
+ * We detected multiple devices. Concatenate them together.
|
||||||
|
+ */
|
||||||
|
+ ltq_mtd->cmtd = mtd_concat_create(ltq_mtd->mtd, devices_found, dev_name(&pdev->dev));
|
||||||
|
+ if (ltq_mtd->cmtd == NULL)
|
||||||
|
+ err = -ENXIO;
|
||||||
|
}
|
||||||
|
|
||||||
- ltq_mtd->mtd->dev.parent = &pdev->dev;
|
- ltq_mtd->mtd->dev.parent = &pdev->dev;
|
||||||
- mtd_set_of_node(ltq_mtd->mtd, pdev->dev.of_node);
|
- mtd_set_of_node(ltq_mtd->mtd, pdev->dev.of_node);
|
||||||
-
|
-
|
||||||
|
@ -1,152 +0,0 @@
|
|||||||
From 58078a30038b578c26c532545448fe3746648390 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Hauke Mehrtens <hauke@hauke-m.de>
|
|
||||||
Date: Thu, 29 Dec 2016 21:02:57 +0100
|
|
||||||
Subject: [PATCH] MIPS: lantiq: lock DMA register accesses for SMP
|
|
||||||
|
|
||||||
The DMA controller channel and port configuration is changed by
|
|
||||||
selecting the port or channel in one register and then update the
|
|
||||||
configuration in other registers. This has to be done in an atomic
|
|
||||||
operation. Previously only the local interrupts were deactivated which
|
|
||||||
works for single CPU systems. If the system supports SMP a better
|
|
||||||
locking is needed, use spinlocks instead.
|
|
||||||
On more recent SoCs (at least xrx200 and later) there are two memory
|
|
||||||
regions to change the configuration, there we could use one area for
|
|
||||||
each CPU and do not have to synchronize between the CPUs and more.
|
|
||||||
|
|
||||||
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
|
||||||
---
|
|
||||||
arch/mips/lantiq/xway/dma.c | 38 ++++++++++++++++++++------------------
|
|
||||||
1 file changed, 20 insertions(+), 18 deletions(-)
|
|
||||||
|
|
||||||
--- a/arch/mips/lantiq/xway/dma.c
|
|
||||||
+++ b/arch/mips/lantiq/xway/dma.c
|
|
||||||
@@ -20,6 +20,7 @@
|
|
||||||
#include <linux/io.h>
|
|
||||||
#include <linux/dma-mapping.h>
|
|
||||||
#include <linux/module.h>
|
|
||||||
+#include <linux/spinlock.h>
|
|
||||||
#include <linux/clk.h>
|
|
||||||
#include <linux/err.h>
|
|
||||||
|
|
||||||
@@ -59,16 +60,17 @@
|
|
||||||
ltq_dma_membase + (z))
|
|
||||||
|
|
||||||
static void __iomem *ltq_dma_membase;
|
|
||||||
+static DEFINE_SPINLOCK(ltq_dma_lock);
|
|
||||||
|
|
||||||
void
|
|
||||||
ltq_dma_enable_irq(struct ltq_dma_channel *ch)
|
|
||||||
{
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
- local_irq_save(flags);
|
|
||||||
+ spin_lock_irqsave(<q_dma_lock, flags);
|
|
||||||
ltq_dma_w32(ch->nr, LTQ_DMA_CS);
|
|
||||||
ltq_dma_w32_mask(0, 1 << ch->nr, LTQ_DMA_IRNEN);
|
|
||||||
- local_irq_restore(flags);
|
|
||||||
+ spin_unlock_irqrestore(<q_dma_lock, flags);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(ltq_dma_enable_irq);
|
|
||||||
|
|
||||||
@@ -77,10 +79,10 @@ ltq_dma_disable_irq(struct ltq_dma_chann
|
|
||||||
{
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
- local_irq_save(flags);
|
|
||||||
+ spin_lock_irqsave(<q_dma_lock, flags);
|
|
||||||
ltq_dma_w32(ch->nr, LTQ_DMA_CS);
|
|
||||||
ltq_dma_w32_mask(1 << ch->nr, 0, LTQ_DMA_IRNEN);
|
|
||||||
- local_irq_restore(flags);
|
|
||||||
+ spin_unlock_irqrestore(<q_dma_lock, flags);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(ltq_dma_disable_irq);
|
|
||||||
|
|
||||||
@@ -89,10 +91,10 @@ ltq_dma_ack_irq(struct ltq_dma_channel *
|
|
||||||
{
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
- local_irq_save(flags);
|
|
||||||
+ spin_lock_irqsave(<q_dma_lock, flags);
|
|
||||||
ltq_dma_w32(ch->nr, LTQ_DMA_CS);
|
|
||||||
ltq_dma_w32(DMA_IRQ_ACK, LTQ_DMA_CIS);
|
|
||||||
- local_irq_restore(flags);
|
|
||||||
+ spin_unlock_irqrestore(<q_dma_lock, flags);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(ltq_dma_ack_irq);
|
|
||||||
|
|
||||||
@@ -101,11 +103,11 @@ ltq_dma_open(struct ltq_dma_channel *ch)
|
|
||||||
{
|
|
||||||
unsigned long flag;
|
|
||||||
|
|
||||||
- local_irq_save(flag);
|
|
||||||
+ spin_lock_irqsave(<q_dma_lock, flag);
|
|
||||||
ltq_dma_w32(ch->nr, LTQ_DMA_CS);
|
|
||||||
ltq_dma_w32_mask(0, DMA_CHAN_ON, LTQ_DMA_CCTRL);
|
|
||||||
- ltq_dma_enable_irq(ch);
|
|
||||||
- local_irq_restore(flag);
|
|
||||||
+ ltq_dma_w32_mask(0, 1 << ch->nr, LTQ_DMA_IRNEN);
|
|
||||||
+ spin_unlock_irqrestore(<q_dma_lock, flag);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(ltq_dma_open);
|
|
||||||
|
|
||||||
@@ -114,11 +116,11 @@ ltq_dma_close(struct ltq_dma_channel *ch
|
|
||||||
{
|
|
||||||
unsigned long flag;
|
|
||||||
|
|
||||||
- local_irq_save(flag);
|
|
||||||
+ spin_lock_irqsave(<q_dma_lock, flag);
|
|
||||||
ltq_dma_w32(ch->nr, LTQ_DMA_CS);
|
|
||||||
ltq_dma_w32_mask(DMA_CHAN_ON, 0, LTQ_DMA_CCTRL);
|
|
||||||
- ltq_dma_disable_irq(ch);
|
|
||||||
- local_irq_restore(flag);
|
|
||||||
+ ltq_dma_w32_mask(1 << ch->nr, 0, LTQ_DMA_IRNEN);
|
|
||||||
+ spin_unlock_irqrestore(<q_dma_lock, flag);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(ltq_dma_close);
|
|
||||||
|
|
||||||
@@ -133,7 +135,7 @@ ltq_dma_alloc(struct ltq_dma_channel *ch
|
|
||||||
&ch->phys, GFP_ATOMIC);
|
|
||||||
memset(ch->desc_base, 0, LTQ_DESC_NUM * LTQ_DESC_SIZE);
|
|
||||||
|
|
||||||
- local_irq_save(flags);
|
|
||||||
+ spin_lock_irqsave(<q_dma_lock, flags);
|
|
||||||
ltq_dma_w32(ch->nr, LTQ_DMA_CS);
|
|
||||||
ltq_dma_w32(ch->phys, LTQ_DMA_CDBA);
|
|
||||||
ltq_dma_w32(LTQ_DESC_NUM, LTQ_DMA_CDLEN);
|
|
||||||
@@ -142,7 +144,7 @@ ltq_dma_alloc(struct ltq_dma_channel *ch
|
|
||||||
ltq_dma_w32_mask(0, DMA_CHAN_RST, LTQ_DMA_CCTRL);
|
|
||||||
while (ltq_dma_r32(LTQ_DMA_CCTRL) & DMA_CHAN_RST)
|
|
||||||
;
|
|
||||||
- local_irq_restore(flags);
|
|
||||||
+ spin_unlock_irqrestore(<q_dma_lock, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
@@ -152,11 +154,11 @@ ltq_dma_alloc_tx(struct ltq_dma_channel
|
|
||||||
|
|
||||||
ltq_dma_alloc(ch);
|
|
||||||
|
|
||||||
- local_irq_save(flags);
|
|
||||||
+ spin_lock_irqsave(<q_dma_lock, flags);
|
|
||||||
ltq_dma_w32(DMA_DESCPT, LTQ_DMA_CIE);
|
|
||||||
ltq_dma_w32_mask(0, 1 << ch->nr, LTQ_DMA_IRNEN);
|
|
||||||
ltq_dma_w32(DMA_WEIGHT | DMA_TX, LTQ_DMA_CCTRL);
|
|
||||||
- local_irq_restore(flags);
|
|
||||||
+ spin_unlock_irqrestore(<q_dma_lock, flags);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(ltq_dma_alloc_tx);
|
|
||||||
|
|
||||||
@@ -167,11 +169,11 @@ ltq_dma_alloc_rx(struct ltq_dma_channel
|
|
||||||
|
|
||||||
ltq_dma_alloc(ch);
|
|
||||||
|
|
||||||
- local_irq_save(flags);
|
|
||||||
+ spin_lock_irqsave(<q_dma_lock, flags);
|
|
||||||
ltq_dma_w32(DMA_DESCPT, LTQ_DMA_CIE);
|
|
||||||
ltq_dma_w32_mask(0, 1 << ch->nr, LTQ_DMA_IRNEN);
|
|
||||||
ltq_dma_w32(DMA_WEIGHT, LTQ_DMA_CCTRL);
|
|
||||||
- local_irq_restore(flags);
|
|
||||||
+ spin_unlock_irqrestore(<q_dma_lock, flags);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(ltq_dma_alloc_rx);
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
|||||||
--- a/arch/mips/lantiq/xway/sysctrl.c
|
--- a/arch/mips/lantiq/xway/sysctrl.c
|
||||||
+++ b/arch/mips/lantiq/xway/sysctrl.c
|
+++ b/arch/mips/lantiq/xway/sysctrl.c
|
||||||
@@ -442,6 +442,20 @@ static void clkdev_add_clkout(void)
|
@@ -424,6 +424,20 @@ static void clkdev_add_clkout(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -21,9 +21,9 @@
|
|||||||
/* bring up all register ranges that we need for basic system control */
|
/* bring up all register ranges that we need for basic system control */
|
||||||
void __init ltq_soc_init(void)
|
void __init ltq_soc_init(void)
|
||||||
{
|
{
|
||||||
@@ -628,4 +642,6 @@ void __init ltq_soc_init(void)
|
@@ -589,4 +603,6 @@ void __init ltq_soc_init(void)
|
||||||
if (of_machine_is_compatible("lantiq,vr9"))
|
clkdev_add_pmu("1e100400.serial", NULL, 1, 0, PMU_ASC0);
|
||||||
xbar_fpi_burst_disable();
|
}
|
||||||
usb_set_clock();
|
usb_set_clock();
|
||||||
+
|
+
|
||||||
+ set_phy_clock_source(np_cgu);
|
+ set_phy_clock_source(np_cgu);
|
||||||
|
@ -1,184 +0,0 @@
|
|||||||
--- a/drivers/hwmon/Makefile
|
|
||||||
+++ b/drivers/hwmon/Makefile
|
|
||||||
@@ -109,6 +109,7 @@ obj-$(CONFIG_SENSORS_LTC4222) += ltc4222
|
|
||||||
obj-$(CONFIG_SENSORS_LTC4245) += ltc4245.o
|
|
||||||
obj-$(CONFIG_SENSORS_LTC4260) += ltc4260.o
|
|
||||||
obj-$(CONFIG_SENSORS_LTC4261) += ltc4261.o
|
|
||||||
+obj-$(CONFIG_SENSORS_LTQ_CPUTEMP) += ltq-cputemp.o
|
|
||||||
obj-$(CONFIG_SENSORS_MAX1111) += max1111.o
|
|
||||||
obj-$(CONFIG_SENSORS_MAX16065) += max16065.o
|
|
||||||
obj-$(CONFIG_SENSORS_MAX1619) += max1619.o
|
|
||||||
--- a/drivers/hwmon/Kconfig
|
|
||||||
+++ b/drivers/hwmon/Kconfig
|
|
||||||
@@ -780,6 +780,14 @@ config SENSORS_LTC4261
|
|
||||||
This driver can also be built as a module. If so, the module will
|
|
||||||
be called ltc4261.
|
|
||||||
|
|
||||||
+config SENSORS_LTQ_CPUTEMP
|
|
||||||
+ bool "Lantiq CPU temperature sensor"
|
|
||||||
+ depends on LANTIQ
|
|
||||||
+ default n
|
|
||||||
+ help
|
|
||||||
+ If you say yes here you get support for the temperature
|
|
||||||
+ sensor inside your CPU.
|
|
||||||
+
|
|
||||||
config SENSORS_MAX1111
|
|
||||||
tristate "Maxim MAX1111 Serial 8-bit ADC chip and compatibles"
|
|
||||||
depends on SPI_MASTER
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/drivers/hwmon/ltq-cputemp.c
|
|
||||||
@@ -0,0 +1,154 @@
|
|
||||||
+/* Lantiq CPU Temperatur sensor driver for xrx200
|
|
||||||
+ *
|
|
||||||
+ * Copyright (C) 2016 Florian Eckert <feckert@tdt.de>
|
|
||||||
+ *
|
|
||||||
+ * This program is free software; you can redistribute it and/or modify
|
|
||||||
+ * it under the terms of the GNU General Public License as published by
|
|
||||||
+ * the Free Software Foundation; either version 2 of the License, or
|
|
||||||
+ * (at your option) any later version
|
|
||||||
+ *
|
|
||||||
+ * This program is distributed in the hope that it will be useful
|
|
||||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
+ * GNU General Public License for more details
|
|
||||||
+ *
|
|
||||||
+ * You should have received a copy of the GNU General Public License
|
|
||||||
+ * along with this program; if not, see <http://www.gnu.org/licenses/>
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+#include <linux/module.h>
|
|
||||||
+#include <linux/init.h>
|
|
||||||
+#include <linux/delay.h>
|
|
||||||
+#include <linux/of_device.h>
|
|
||||||
+#include <linux/hwmon.h>
|
|
||||||
+#include <linux/hwmon-sysfs.h>
|
|
||||||
+
|
|
||||||
+#include <lantiq_soc.h>
|
|
||||||
+
|
|
||||||
+/* gphy1 configuration register contains cpu temperature */
|
|
||||||
+#define CGU_GPHY1_CR 0x0040
|
|
||||||
+#define CGU_TEMP_PD BIT(19)
|
|
||||||
+
|
|
||||||
+static void ltq_cputemp_enable(void)
|
|
||||||
+{
|
|
||||||
+ ltq_cgu_w32(ltq_cgu_r32(CGU_GPHY1_CR) | CGU_TEMP_PD, CGU_GPHY1_CR);
|
|
||||||
+
|
|
||||||
+ /* wait a short moment to let the SoC get the first temperatur value */
|
|
||||||
+ mdelay(100);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void ltq_cputemp_disable(void)
|
|
||||||
+{
|
|
||||||
+ ltq_cgu_w32(ltq_cgu_r32(CGU_GPHY1_CR) & ~CGU_TEMP_PD, CGU_GPHY1_CR);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int ltq_cputemp_read(void)
|
|
||||||
+{
|
|
||||||
+ int value;
|
|
||||||
+
|
|
||||||
+ /* get the temperature including one decimal place */
|
|
||||||
+ value = (ltq_cgu_r32(CGU_GPHY1_CR) >> 9) & 0x01FF;
|
|
||||||
+ value = (value << 2 ) + value;
|
|
||||||
+
|
|
||||||
+ /* range -38 to +154 °C, register value zero is -38.0 °C */
|
|
||||||
+ value -= 380;
|
|
||||||
+
|
|
||||||
+ return value;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static ssize_t show_cputemp(struct device *dev,
|
|
||||||
+ struct device_attribute *attr, char *buf)
|
|
||||||
+{
|
|
||||||
+ int value;
|
|
||||||
+
|
|
||||||
+ value = ltq_cputemp_read();
|
|
||||||
+ /* scale temp to millidegree */
|
|
||||||
+ value = value * 100;
|
|
||||||
+
|
|
||||||
+ return sprintf(buf, "%d\n", value);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static DEVICE_ATTR(temp1_input, S_IRUGO, show_cputemp, NULL);
|
|
||||||
+
|
|
||||||
+static struct attribute *ltq_cputemp_attrs[] = {
|
|
||||||
+ &dev_attr_temp1_input.attr,
|
|
||||||
+ NULL
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+ATTRIBUTE_GROUPS(ltq_cputemp);
|
|
||||||
+
|
|
||||||
+static int ltq_cputemp_probe(struct platform_device *pdev)
|
|
||||||
+{
|
|
||||||
+ int value = 0;
|
|
||||||
+ int ret;
|
|
||||||
+ struct device *hwmon_dev;
|
|
||||||
+
|
|
||||||
+ /* available on vr9 v1.2 SoCs only */
|
|
||||||
+ if (ltq_soc_type() != SOC_TYPE_VR9_2)
|
|
||||||
+ return -ENODEV;
|
|
||||||
+
|
|
||||||
+ hwmon_dev = devm_hwmon_device_register_with_groups(&pdev->dev,
|
|
||||||
+ "CPU0",
|
|
||||||
+ NULL,
|
|
||||||
+ ltq_cputemp_groups);
|
|
||||||
+
|
|
||||||
+ if (IS_ERR(hwmon_dev)) {
|
|
||||||
+ dev_err(&pdev->dev, "Failed to register as hwmon device");
|
|
||||||
+ ret = PTR_ERR(hwmon_dev);
|
|
||||||
+ goto error_hwmon;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ ltq_cputemp_enable();
|
|
||||||
+ value = ltq_cputemp_read();
|
|
||||||
+ dev_info(&pdev->dev, "Current CPU die temperature: %d.%d °C", value / 10, value % 10);
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+
|
|
||||||
+error_hwmon:
|
|
||||||
+ return ret;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int ltq_cputemp_release(struct platform_device *pdev)
|
|
||||||
+{
|
|
||||||
+ hwmon_device_unregister(&pdev->dev);
|
|
||||||
+ ltq_cputemp_disable();
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+const struct of_device_id ltq_cputemp_match[] = {
|
|
||||||
+ { .compatible = "lantiq,cputemp" },
|
|
||||||
+ {},
|
|
||||||
+};
|
|
||||||
+MODULE_DEVICE_TABLE(of, ltq_cputemp_match);
|
|
||||||
+
|
|
||||||
+static struct platform_driver ltq_cputemp_driver = {
|
|
||||||
+ .probe = ltq_cputemp_probe,
|
|
||||||
+ .remove = ltq_cputemp_release,
|
|
||||||
+ .driver = {
|
|
||||||
+ .name = "ltq-cputemp",
|
|
||||||
+ .owner = THIS_MODULE,
|
|
||||||
+ .of_match_table = ltq_cputemp_match,
|
|
||||||
+ },
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+int __init init_ltq_cputemp(void)
|
|
||||||
+{
|
|
||||||
+ int ret;
|
|
||||||
+
|
|
||||||
+ ret = platform_driver_register(<q_cputemp_driver);
|
|
||||||
+ return ret;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void clean_ltq_cputemp(void)
|
|
||||||
+{
|
|
||||||
+ platform_driver_unregister(<q_cputemp_driver);
|
|
||||||
+ return;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+module_init(init_ltq_cputemp);
|
|
||||||
+module_exit(clean_ltq_cputemp);
|
|
||||||
+
|
|
||||||
+MODULE_AUTHOR("Florian Eckert <feckert@tdt.de>");
|
|
||||||
+
|
|
||||||
+MODULE_DESCRIPTION("Lantiq Temperature Sensor");
|
|
||||||
+MODULE_LICENSE("GPL");
|
|
@ -6,6 +6,7 @@ CONFIG_CPU_MIPSR2_IRQ_EI=y
|
|||||||
CONFIG_CPU_MIPSR2_IRQ_VI=y
|
CONFIG_CPU_MIPSR2_IRQ_VI=y
|
||||||
CONFIG_CPU_RMAP=y
|
CONFIG_CPU_RMAP=y
|
||||||
CONFIG_CRC16=y
|
CONFIG_CRC16=y
|
||||||
|
CONFIG_CRYPTO_ACOMP2=y
|
||||||
CONFIG_CRYPTO_AEAD=y
|
CONFIG_CRYPTO_AEAD=y
|
||||||
CONFIG_CRYPTO_AEAD2=y
|
CONFIG_CRYPTO_AEAD2=y
|
||||||
CONFIG_CRYPTO_DEFLATE=y
|
CONFIG_CRYPTO_DEFLATE=y
|
||||||
@ -13,6 +14,8 @@ CONFIG_CRYPTO_LZO=y
|
|||||||
CONFIG_CRYPTO_MANAGER=y
|
CONFIG_CRYPTO_MANAGER=y
|
||||||
CONFIG_CRYPTO_MANAGER2=y
|
CONFIG_CRYPTO_MANAGER2=y
|
||||||
CONFIG_CRYPTO_NULL2=y
|
CONFIG_CRYPTO_NULL2=y
|
||||||
|
CONFIG_EXTRA_FIRMWARE="lantiq/xrx200_phy11g_a14.bin lantiq/xrx200_phy11g_a22.bin lantiq/xrx200_phy22f_a14.bin lantiq/xrx200_phy22f_a22.bin"
|
||||||
|
CONFIG_EXTRA_FIRMWARE_DIR="firmware"
|
||||||
CONFIG_FIRMWARE_IN_KERNEL=y
|
CONFIG_FIRMWARE_IN_KERNEL=y
|
||||||
CONFIG_HWMON=y
|
CONFIG_HWMON=y
|
||||||
CONFIG_ICPLUS_PHY=y
|
CONFIG_ICPLUS_PHY=y
|
||||||
@ -57,10 +60,14 @@ CONFIG_PCI=y
|
|||||||
CONFIG_PCIE_LANTIQ=y
|
CONFIG_PCIE_LANTIQ=y
|
||||||
CONFIG_PCI_DOMAINS=y
|
CONFIG_PCI_DOMAINS=y
|
||||||
CONFIG_PCI_LANTIQ=y
|
CONFIG_PCI_LANTIQ=y
|
||||||
CONFIG_POWER_RESET=y
|
|
||||||
CONFIG_POWER_RESET_GPIO=y
|
CONFIG_POWER_RESET_GPIO=y
|
||||||
CONFIG_POWER_SUPPLY=y
|
CONFIG_POWER_SUPPLY=y
|
||||||
|
CONFIG_QUEUED_RWLOCKS=y
|
||||||
|
CONFIG_QUEUED_SPINLOCKS=y
|
||||||
|
CONFIG_RCU_NEED_SEGCBLIST=y
|
||||||
CONFIG_RCU_STALL_COMMON=y
|
CONFIG_RCU_STALL_COMMON=y
|
||||||
|
CONFIG_REGULATOR=y
|
||||||
|
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||||
CONFIG_RFS_ACCEL=y
|
CONFIG_RFS_ACCEL=y
|
||||||
CONFIG_RPS=y
|
CONFIG_RPS=y
|
||||||
CONFIG_RTL8306_PHY=y
|
CONFIG_RTL8306_PHY=y
|
||||||
@ -75,6 +82,7 @@ CONFIG_SYNC_R4K=y
|
|||||||
CONFIG_SYS_SUPPORTS_SCHED_SMT=y
|
CONFIG_SYS_SUPPORTS_SCHED_SMT=y
|
||||||
CONFIG_SYS_SUPPORTS_SMP=y
|
CONFIG_SYS_SUPPORTS_SMP=y
|
||||||
CONFIG_TREE_RCU=y
|
CONFIG_TREE_RCU=y
|
||||||
|
CONFIG_TREE_SRCU=y
|
||||||
CONFIG_UBIFS_FS=y
|
CONFIG_UBIFS_FS=y
|
||||||
CONFIG_UBIFS_FS_ADVANCED_COMPR=y
|
CONFIG_UBIFS_FS_ADVANCED_COMPR=y
|
||||||
CONFIG_UBIFS_FS_LZO=y
|
CONFIG_UBIFS_FS_LZO=y
|
||||||
@ -83,7 +91,6 @@ CONFIG_USB=y
|
|||||||
CONFIG_USB_COMMON=y
|
CONFIG_USB_COMMON=y
|
||||||
# CONFIG_USB_EHCI_HCD is not set
|
# CONFIG_USB_EHCI_HCD is not set
|
||||||
CONFIG_USB_SUPPORT=y
|
CONFIG_USB_SUPPORT=y
|
||||||
# CONFIG_USB_UHCI_HCD is not set
|
|
||||||
CONFIG_XPS=y
|
CONFIG_XPS=y
|
||||||
CONFIG_XRX200_PHY_FW=y
|
CONFIG_XRX200_PHY_FW=y
|
||||||
CONFIG_ZLIB_DEFLATE=y
|
CONFIG_ZLIB_DEFLATE=y
|
||||||
|
@ -2,6 +2,7 @@ CONFIG_ADM6996_PHY=y
|
|||||||
CONFIG_AR8216_PHY=y
|
CONFIG_AR8216_PHY=y
|
||||||
CONFIG_BLK_MQ_PCI=y
|
CONFIG_BLK_MQ_PCI=y
|
||||||
CONFIG_CRC16=y
|
CONFIG_CRC16=y
|
||||||
|
CONFIG_CRYPTO_ACOMP2=y
|
||||||
CONFIG_CRYPTO_DEFLATE=y
|
CONFIG_CRYPTO_DEFLATE=y
|
||||||
CONFIG_CRYPTO_LZO=y
|
CONFIG_CRYPTO_LZO=y
|
||||||
CONFIG_FIRMWARE_IN_KERNEL=y
|
CONFIG_FIRMWARE_IN_KERNEL=y
|
||||||
@ -31,6 +32,8 @@ CONFIG_PCI=y
|
|||||||
# CONFIG_PCIE_LANTIQ is not set
|
# CONFIG_PCIE_LANTIQ is not set
|
||||||
CONFIG_PCI_DOMAINS=y
|
CONFIG_PCI_DOMAINS=y
|
||||||
CONFIG_PCI_LANTIQ=y
|
CONFIG_PCI_LANTIQ=y
|
||||||
|
CONFIG_REGULATOR=y
|
||||||
|
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||||
CONFIG_RTL8306_PHY=y
|
CONFIG_RTL8306_PHY=y
|
||||||
CONFIG_RTL8366S_PHY=y
|
CONFIG_RTL8366S_PHY=y
|
||||||
CONFIG_RTL8367B_PHY=y
|
CONFIG_RTL8367B_PHY=y
|
||||||
@ -43,6 +46,5 @@ CONFIG_USB=y
|
|||||||
CONFIG_USB_COMMON=y
|
CONFIG_USB_COMMON=y
|
||||||
# CONFIG_USB_EHCI_HCD is not set
|
# CONFIG_USB_EHCI_HCD is not set
|
||||||
CONFIG_USB_SUPPORT=y
|
CONFIG_USB_SUPPORT=y
|
||||||
# CONFIG_USB_UHCI_HCD is not set
|
|
||||||
CONFIG_ZLIB_DEFLATE=y
|
CONFIG_ZLIB_DEFLATE=y
|
||||||
CONFIG_ZLIB_INFLATE=y
|
CONFIG_ZLIB_INFLATE=y
|
||||||
|
@ -2,6 +2,7 @@ CONFIG_ADM6996_PHY=y
|
|||||||
CONFIG_AR8216_PHY=y
|
CONFIG_AR8216_PHY=y
|
||||||
CONFIG_BLK_MQ_PCI=y
|
CONFIG_BLK_MQ_PCI=y
|
||||||
CONFIG_CRC16=y
|
CONFIG_CRC16=y
|
||||||
|
CONFIG_CRYPTO_ACOMP2=y
|
||||||
CONFIG_CRYPTO_DEFLATE=y
|
CONFIG_CRYPTO_DEFLATE=y
|
||||||
CONFIG_CRYPTO_LZO=y
|
CONFIG_CRYPTO_LZO=y
|
||||||
CONFIG_FIRMWARE_IN_KERNEL=y
|
CONFIG_FIRMWARE_IN_KERNEL=y
|
||||||
@ -24,6 +25,8 @@ CONFIG_PCI=y
|
|||||||
# CONFIG_PCIE_LANTIQ is not set
|
# CONFIG_PCIE_LANTIQ is not set
|
||||||
CONFIG_PCI_DOMAINS=y
|
CONFIG_PCI_DOMAINS=y
|
||||||
CONFIG_PCI_LANTIQ=y
|
CONFIG_PCI_LANTIQ=y
|
||||||
|
CONFIG_REGULATOR=y
|
||||||
|
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||||
CONFIG_RTL8306_PHY=y
|
CONFIG_RTL8306_PHY=y
|
||||||
CONFIG_RTL8366S_PHY=y
|
CONFIG_RTL8366S_PHY=y
|
||||||
CONFIG_RTL8367B_PHY=y
|
CONFIG_RTL8367B_PHY=y
|
||||||
@ -32,6 +35,5 @@ CONFIG_USB=y
|
|||||||
CONFIG_USB_COMMON=y
|
CONFIG_USB_COMMON=y
|
||||||
# CONFIG_USB_EHCI_HCD is not set
|
# CONFIG_USB_EHCI_HCD is not set
|
||||||
CONFIG_USB_SUPPORT=y
|
CONFIG_USB_SUPPORT=y
|
||||||
# CONFIG_USB_UHCI_HCD is not set
|
|
||||||
CONFIG_ZLIB_DEFLATE=y
|
CONFIG_ZLIB_DEFLATE=y
|
||||||
CONFIG_ZLIB_INFLATE=y
|
CONFIG_ZLIB_INFLATE=y
|
||||||
|
Loading…
Reference in New Issue
Block a user