mirror of
https://github.com/torvalds/linux.git
synced 2024-10-31 17:21:49 +00:00
Merge branch 'master' of git://dev.phrozen.org/mips-next into mips-for-linux-next
This commit is contained in:
commit
382fc33b4a
33
Documentation/devicetree/bindings/spi/spi-octeon.txt
Normal file
33
Documentation/devicetree/bindings/spi/spi-octeon.txt
Normal file
@ -0,0 +1,33 @@
|
||||
Cavium, Inc. OCTEON SOC SPI master controller.
|
||||
|
||||
Required properties:
|
||||
- compatible : "cavium,octeon-3010-spi"
|
||||
- reg : The register base for the controller.
|
||||
- interrupts : One interrupt, used by the controller.
|
||||
- #address-cells : <1>, as required by generic SPI binding.
|
||||
- #size-cells : <0>, also as required by generic SPI binding.
|
||||
|
||||
Child nodes as per the generic SPI binding.
|
||||
|
||||
Example:
|
||||
|
||||
spi@1070000001000 {
|
||||
compatible = "cavium,octeon-3010-spi";
|
||||
reg = <0x10700 0x00001000 0x0 0x100>;
|
||||
interrupts = <0 58>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
eeprom@0 {
|
||||
compatible = "st,m95256", "atmel,at25";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <5000000>;
|
||||
spi-cpha;
|
||||
spi-cpol;
|
||||
|
||||
pagesize = <64>;
|
||||
size = <32768>;
|
||||
address-width = <16>;
|
||||
};
|
||||
};
|
||||
|
@ -844,6 +844,7 @@ config NLM_XLP_BOARD
|
||||
select ZONE_DMA if 64BIT
|
||||
select SYNC_R4K
|
||||
select SYS_HAS_EARLY_PRINTK
|
||||
select USE_OF
|
||||
help
|
||||
This board is based on Netlogic XLP Processor.
|
||||
Say Y here if you have a XLP based board.
|
||||
@ -1892,6 +1893,18 @@ config SIBYTE_DMA_PAGEOPS
|
||||
config CPU_HAS_PREFETCH
|
||||
bool
|
||||
|
||||
config CPU_GENERIC_DUMP_TLB
|
||||
bool
|
||||
default y if !(CPU_R3000 || CPU_R6000 || CPU_R8000 || CPU_TX39XX)
|
||||
|
||||
config CPU_R4K_FPU
|
||||
bool
|
||||
default y if !(CPU_R3000 || CPU_R6000 || CPU_TX39XX || CPU_CAVIUM_OCTEON)
|
||||
|
||||
config CPU_R4K_CACHE_TLB
|
||||
bool
|
||||
default y if !(CPU_R3000 || CPU_R8000 || CPU_SB1 || CPU_TX39XX || CPU_CAVIUM_OCTEON)
|
||||
|
||||
choice
|
||||
prompt "MIPS MT options"
|
||||
|
||||
|
@ -56,8 +56,8 @@ static void __internal_irq_unmask_64(unsigned int irq) __maybe_unused;
|
||||
#define is_ext_irq_cascaded 0
|
||||
#define ext_irq_start 0
|
||||
#define ext_irq_end 0
|
||||
#define ext_irq_count 0
|
||||
#define ext_irq_cfg_reg1 0
|
||||
#define ext_irq_count 4
|
||||
#define ext_irq_cfg_reg1 PERF_EXTIRQ_CFG_REG_6345
|
||||
#define ext_irq_cfg_reg2 0
|
||||
#endif
|
||||
#ifdef CONFIG_BCM63XX_CPU_6348
|
||||
@ -143,11 +143,15 @@ static void bcm63xx_init_irq(void)
|
||||
irq_stat_addr += PERF_IRQSTAT_6338_REG;
|
||||
irq_mask_addr += PERF_IRQMASK_6338_REG;
|
||||
irq_bits = 32;
|
||||
ext_irq_count = 4;
|
||||
ext_irq_cfg_reg1 = PERF_EXTIRQ_CFG_REG_6338;
|
||||
break;
|
||||
case BCM6345_CPU_ID:
|
||||
irq_stat_addr += PERF_IRQSTAT_6345_REG;
|
||||
irq_mask_addr += PERF_IRQMASK_6345_REG;
|
||||
irq_bits = 32;
|
||||
ext_irq_count = 4;
|
||||
ext_irq_cfg_reg1 = PERF_EXTIRQ_CFG_REG_6345;
|
||||
break;
|
||||
case BCM6348_CPU_ID:
|
||||
irq_stat_addr += PERF_IRQSTAT_6348_REG;
|
||||
@ -434,7 +438,8 @@ static int bcm63xx_external_irq_set_type(struct irq_data *d,
|
||||
reg = bcm_perf_readl(regaddr);
|
||||
irq %= 4;
|
||||
|
||||
if (BCMCPU_IS_6348()) {
|
||||
switch (bcm63xx_get_cpu_id()) {
|
||||
case BCM6348_CPU_ID:
|
||||
if (levelsense)
|
||||
reg |= EXTIRQ_CFG_LEVELSENSE_6348(irq);
|
||||
else
|
||||
@ -447,9 +452,13 @@ static int bcm63xx_external_irq_set_type(struct irq_data *d,
|
||||
reg |= EXTIRQ_CFG_BOTHEDGE_6348(irq);
|
||||
else
|
||||
reg &= ~EXTIRQ_CFG_BOTHEDGE_6348(irq);
|
||||
}
|
||||
break;
|
||||
|
||||
if (BCMCPU_IS_6338() || BCMCPU_IS_6358() || BCMCPU_IS_6368()) {
|
||||
case BCM6328_CPU_ID:
|
||||
case BCM6338_CPU_ID:
|
||||
case BCM6345_CPU_ID:
|
||||
case BCM6358_CPU_ID:
|
||||
case BCM6368_CPU_ID:
|
||||
if (levelsense)
|
||||
reg |= EXTIRQ_CFG_LEVELSENSE(irq);
|
||||
else
|
||||
@ -462,6 +471,9 @@ static int bcm63xx_external_irq_set_type(struct irq_data *d,
|
||||
reg |= EXTIRQ_CFG_BOTHEDGE(irq);
|
||||
else
|
||||
reg &= ~EXTIRQ_CFG_BOTHEDGE(irq);
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
|
||||
bcm_perf_writel(reg, regaddr);
|
||||
|
@ -74,6 +74,9 @@ void bcm63xx_machine_reboot(void)
|
||||
case BCM6338_CPU_ID:
|
||||
perf_regs[0] = PERF_EXTIRQ_CFG_REG_6338;
|
||||
break;
|
||||
case BCM6345_CPU_ID:
|
||||
perf_regs[0] = PERF_EXTIRQ_CFG_REG_6345;
|
||||
break;
|
||||
case BCM6348_CPU_ID:
|
||||
perf_regs[0] = PERF_EXTIRQ_CFG_REG_6348;
|
||||
break;
|
||||
@ -83,6 +86,9 @@ void bcm63xx_machine_reboot(void)
|
||||
}
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
if (!perf_regs[i])
|
||||
break;
|
||||
|
||||
reg = bcm_perf_readl(perf_regs[i]);
|
||||
if (BCMCPU_IS_6348()) {
|
||||
reg &= ~EXTIRQ_CFG_MASK_ALL_6348;
|
||||
|
@ -1,14 +1,12 @@
|
||||
CONFIG_NLM_XLP_BOARD=y
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_PAGE_SIZE_16KB=y
|
||||
# CONFIG_HW_PERF_EVENTS is not set
|
||||
CONFIG_KSM=y
|
||||
CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
# CONFIG_SECCOMP is not set
|
||||
CONFIG_USE_OF=y
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_CROSS_COMPILE=""
|
||||
# CONFIG_LOCALVERSION_AUTO is not set
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
@ -19,13 +17,13 @@ CONFIG_TASK_DELAY_ACCT=y
|
||||
CONFIG_TASK_XACCT=y
|
||||
CONFIG_TASK_IO_ACCOUNTING=y
|
||||
CONFIG_AUDIT=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_CGROUPS=y
|
||||
CONFIG_NAMESPACES=y
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_RD_BZIP2=y
|
||||
CONFIG_RD_LZMA=y
|
||||
CONFIG_INITRAMFS_COMPRESSION_LZMA=y
|
||||
CONFIG_KALLSYMS_ALL=y
|
||||
CONFIG_EMBEDDED=y
|
||||
# CONFIG_COMPAT_BRK is not set
|
||||
@ -35,6 +33,29 @@ CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_MODVERSIONS=y
|
||||
CONFIG_MODULE_SRCVERSION_ALL=y
|
||||
CONFIG_BLK_DEV_INTEGRITY=y
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
CONFIG_ACORN_PARTITION=y
|
||||
CONFIG_ACORN_PARTITION_ICS=y
|
||||
CONFIG_ACORN_PARTITION_RISCIX=y
|
||||
CONFIG_OSF_PARTITION=y
|
||||
CONFIG_AMIGA_PARTITION=y
|
||||
CONFIG_ATARI_PARTITION=y
|
||||
CONFIG_MAC_PARTITION=y
|
||||
CONFIG_BSD_DISKLABEL=y
|
||||
CONFIG_MINIX_SUBPARTITION=y
|
||||
CONFIG_SOLARIS_X86_PARTITION=y
|
||||
CONFIG_UNIXWARE_DISKLABEL=y
|
||||
CONFIG_LDM_PARTITION=y
|
||||
CONFIG_SGI_PARTITION=y
|
||||
CONFIG_ULTRIX_PARTITION=y
|
||||
CONFIG_SUN_PARTITION=y
|
||||
CONFIG_KARMA_PARTITION=y
|
||||
CONFIG_EFI_PARTITION=y
|
||||
CONFIG_SYSV68_PARTITION=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_DEBUG=y
|
||||
CONFIG_PCI_REALLOC_ENABLE_AUTO=y
|
||||
CONFIG_PCI_STUB=y
|
||||
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
|
||||
CONFIG_BINFMT_MISC=y
|
||||
CONFIG_MIPS32_COMPAT=y
|
||||
@ -170,7 +191,6 @@ CONFIG_IP_NF_MATCH_ECN=m
|
||||
CONFIG_IP_NF_MATCH_TTL=m
|
||||
CONFIG_IP_NF_FILTER=m
|
||||
CONFIG_IP_NF_TARGET_REJECT=m
|
||||
CONFIG_IP_NF_TARGET_LOG=m
|
||||
CONFIG_IP_NF_TARGET_ULOG=m
|
||||
CONFIG_NF_NAT=m
|
||||
CONFIG_IP_NF_TARGET_MASQUERADE=m
|
||||
@ -186,7 +206,6 @@ CONFIG_IP_NF_ARPTABLES=m
|
||||
CONFIG_IP_NF_ARPFILTER=m
|
||||
CONFIG_IP_NF_ARP_MANGLE=m
|
||||
CONFIG_NF_CONNTRACK_IPV6=m
|
||||
CONFIG_IP6_NF_QUEUE=m
|
||||
CONFIG_IP6_NF_IPTABLES=m
|
||||
CONFIG_IP6_NF_MATCH_AH=m
|
||||
CONFIG_IP6_NF_MATCH_EUI64=m
|
||||
@ -197,7 +216,6 @@ CONFIG_IP6_NF_MATCH_IPV6HEADER=m
|
||||
CONFIG_IP6_NF_MATCH_MH=m
|
||||
CONFIG_IP6_NF_MATCH_RT=m
|
||||
CONFIG_IP6_NF_TARGET_HL=m
|
||||
CONFIG_IP6_NF_TARGET_LOG=m
|
||||
CONFIG_IP6_NF_FILTER=m
|
||||
CONFIG_IP6_NF_TARGET_REJECT=m
|
||||
CONFIG_IP6_NF_MANGLE=m
|
||||
@ -248,9 +266,6 @@ CONFIG_IPDDP_ENCAP=y
|
||||
CONFIG_IPDDP_DECAP=y
|
||||
CONFIG_X25=m
|
||||
CONFIG_LAPB=m
|
||||
CONFIG_ECONET=m
|
||||
CONFIG_ECONET_AUNUDP=y
|
||||
CONFIG_ECONET_NATIVE=y
|
||||
CONFIG_WAN_ROUTER=m
|
||||
CONFIG_PHONET=m
|
||||
CONFIG_IEEE802154=m
|
||||
@ -297,11 +312,21 @@ CONFIG_NET_ACT_SIMP=m
|
||||
CONFIG_NET_ACT_SKBEDIT=m
|
||||
CONFIG_DCB=y
|
||||
CONFIG_NET_PKTGEN=m
|
||||
# CONFIG_WIRELESS is not set
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
# CONFIG_STANDALONE is not set
|
||||
CONFIG_CONNECTOR=y
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_CHAR=y
|
||||
CONFIG_MTD_BLOCK=y
|
||||
CONFIG_MTD_CFI=y
|
||||
CONFIG_MTD_CFI_ADV_OPTIONS=y
|
||||
CONFIG_MTD_CFI_LE_BYTE_SWAP=y
|
||||
CONFIG_MTD_CFI_GEOMETRY=y
|
||||
CONFIG_MTD_CFI_INTELEXT=y
|
||||
CONFIG_MTD_PHYSMAP=y
|
||||
CONFIG_MTD_PHYSMAP_OF=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_CRYPTOLOOP=m
|
||||
CONFIG_BLK_DEV_NBD=m
|
||||
@ -310,7 +335,6 @@ CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_SIZE=65536
|
||||
CONFIG_CDROM_PKTCDVD=y
|
||||
CONFIG_RAID_ATTRS=m
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_SCSI_TGT=m
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=m
|
||||
@ -337,6 +361,48 @@ CONFIG_SCSI_DH_EMC=m
|
||||
CONFIG_SCSI_DH_ALUA=m
|
||||
CONFIG_SCSI_OSD_INITIATOR=m
|
||||
CONFIG_SCSI_OSD_ULD=m
|
||||
CONFIG_ATA=y
|
||||
CONFIG_SATA_AHCI=y
|
||||
CONFIG_SATA_SIL24=y
|
||||
# CONFIG_ATA_SFF is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
# CONFIG_NET_VENDOR_ADAPTEC is not set
|
||||
# CONFIG_NET_VENDOR_ALTEON is not set
|
||||
# CONFIG_NET_VENDOR_AMD is not set
|
||||
# CONFIG_NET_VENDOR_ATHEROS is not set
|
||||
# CONFIG_NET_VENDOR_BROADCOM is not set
|
||||
# CONFIG_NET_VENDOR_BROCADE is not set
|
||||
# CONFIG_NET_VENDOR_CHELSIO is not set
|
||||
# CONFIG_NET_VENDOR_DEC is not set
|
||||
# CONFIG_NET_VENDOR_DLINK is not set
|
||||
# CONFIG_NET_VENDOR_EMULEX is not set
|
||||
# CONFIG_NET_VENDOR_EXAR is not set
|
||||
# CONFIG_NET_VENDOR_HP is not set
|
||||
CONFIG_E1000E=y
|
||||
# CONFIG_NET_VENDOR_I825XX is not set
|
||||
CONFIG_SKY2=y
|
||||
# CONFIG_NET_VENDOR_MELLANOX is not set
|
||||
# CONFIG_NET_VENDOR_MICREL is not set
|
||||
# CONFIG_NET_VENDOR_MYRI is not set
|
||||
# CONFIG_NET_VENDOR_NATSEMI is not set
|
||||
# CONFIG_NET_VENDOR_NVIDIA is not set
|
||||
# CONFIG_NET_VENDOR_OKI is not set
|
||||
# CONFIG_NET_PACKET_ENGINE is not set
|
||||
# CONFIG_NET_VENDOR_QLOGIC is not set
|
||||
# CONFIG_NET_VENDOR_REALTEK is not set
|
||||
# CONFIG_NET_VENDOR_RDC is not set
|
||||
# CONFIG_NET_VENDOR_SEEQ is not set
|
||||
# CONFIG_NET_VENDOR_SILAN is not set
|
||||
# CONFIG_NET_VENDOR_SIS is not set
|
||||
# CONFIG_NET_VENDOR_SMSC is not set
|
||||
# CONFIG_NET_VENDOR_STMICRO is not set
|
||||
# CONFIG_NET_VENDOR_SUN is not set
|
||||
# CONFIG_NET_VENDOR_TEHUTI is not set
|
||||
# CONFIG_NET_VENDOR_TI is not set
|
||||
# CONFIG_NET_VENDOR_TOSHIBA is not set
|
||||
# CONFIG_NET_VENDOR_VIA is not set
|
||||
# CONFIG_NET_VENDOR_WIZNET is not set
|
||||
# CONFIG_INPUT_MOUSEDEV is not set
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
CONFIG_INPUT_EVBUG=m
|
||||
@ -360,16 +426,23 @@ CONFIG_SERIAL_8250_EXTENDED=y
|
||||
CONFIG_SERIAL_8250_MANY_PORTS=y
|
||||
CONFIG_SERIAL_8250_SHARE_IRQ=y
|
||||
CONFIG_SERIAL_8250_RSA=y
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
CONFIG_HW_RANDOM=y
|
||||
CONFIG_HW_RANDOM_TIMERIOMEM=m
|
||||
CONFIG_RAW_DRIVER=m
|
||||
# CONFIG_HWMON is not set
|
||||
CONFIG_I2C=y
|
||||
CONFIG_I2C_CHARDEV=y
|
||||
CONFIG_I2C_OCORES=y
|
||||
CONFIG_SENSORS_LM90=y
|
||||
CONFIG_THERMAL=y
|
||||
# CONFIG_VGA_CONSOLE is not set
|
||||
# CONFIG_HID_SUPPORT is not set
|
||||
# CONFIG_USB_SUPPORT is not set
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_DRV_DS1374=y
|
||||
CONFIG_UIO=y
|
||||
CONFIG_UIO_PDRV=m
|
||||
CONFIG_UIO_PDRV_GENIRQ=m
|
||||
# CONFIG_IOMMU_SUPPORT is not set
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_EXT2_FS_XATTR=y
|
||||
CONFIG_EXT2_FS_POSIX_ACL=y
|
||||
@ -381,15 +454,10 @@ CONFIG_EXT4_FS=y
|
||||
CONFIG_EXT4_FS_POSIX_ACL=y
|
||||
CONFIG_EXT4_FS_SECURITY=y
|
||||
CONFIG_GFS2_FS=m
|
||||
CONFIG_GFS2_FS_LOCKING_DLM=y
|
||||
CONFIG_OCFS2_FS=m
|
||||
CONFIG_BTRFS_FS=m
|
||||
CONFIG_BTRFS_FS_POSIX_ACL=y
|
||||
CONFIG_NILFS2_FS=m
|
||||
CONFIG_QUOTA_NETLINK_INTERFACE=y
|
||||
# CONFIG_PRINT_QUOTA_WARNING is not set
|
||||
CONFIG_QFMT_V1=m
|
||||
CONFIG_QFMT_V2=m
|
||||
CONFIG_AUTOFS4_FS=m
|
||||
CONFIG_FUSE_FS=y
|
||||
CONFIG_CUSE=m
|
||||
@ -415,6 +483,7 @@ CONFIG_HFSPLUS_FS=m
|
||||
CONFIG_BEFS_FS=m
|
||||
CONFIG_BFS_FS=m
|
||||
CONFIG_EFS_FS=m
|
||||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_CRAMFS=m
|
||||
CONFIG_SQUASHFS=m
|
||||
CONFIG_VXFS_FS=m
|
||||
@ -427,7 +496,6 @@ CONFIG_SYSV_FS=m
|
||||
CONFIG_UFS_FS=m
|
||||
CONFIG_EXOFS_FS=m
|
||||
CONFIG_NFS_FS=m
|
||||
CONFIG_NFS_V3=y
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_NFS_V4=y
|
||||
CONFIG_NFS_FSCACHE=y
|
||||
@ -450,25 +518,6 @@ CONFIG_NCPFS_NLS=y
|
||||
CONFIG_NCPFS_EXTRAS=y
|
||||
CONFIG_CODA_FS=m
|
||||
CONFIG_AFS_FS=m
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
CONFIG_ACORN_PARTITION=y
|
||||
CONFIG_ACORN_PARTITION_ICS=y
|
||||
CONFIG_ACORN_PARTITION_RISCIX=y
|
||||
CONFIG_OSF_PARTITION=y
|
||||
CONFIG_AMIGA_PARTITION=y
|
||||
CONFIG_ATARI_PARTITION=y
|
||||
CONFIG_MAC_PARTITION=y
|
||||
CONFIG_BSD_DISKLABEL=y
|
||||
CONFIG_MINIX_SUBPARTITION=y
|
||||
CONFIG_SOLARIS_X86_PARTITION=y
|
||||
CONFIG_UNIXWARE_DISKLABEL=y
|
||||
CONFIG_LDM_PARTITION=y
|
||||
CONFIG_SGI_PARTITION=y
|
||||
CONFIG_ULTRIX_PARTITION=y
|
||||
CONFIG_SUN_PARTITION=y
|
||||
CONFIG_KARMA_PARTITION=y
|
||||
CONFIG_EFI_PARTITION=y
|
||||
CONFIG_SYSV68_PARTITION=y
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NLS_DEFAULT="cp437"
|
||||
CONFIG_NLS_CODEPAGE_437=m
|
||||
@ -518,12 +567,10 @@ CONFIG_SCHEDSTATS=y
|
||||
CONFIG_TIMER_STATS=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DEBUG_MEMORY_INIT=y
|
||||
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
||||
CONFIG_SCHED_TRACER=y
|
||||
CONFIG_BLK_DEV_IO_TRACE=y
|
||||
CONFIG_KGDB=y
|
||||
CONFIG_SECURITY=y
|
||||
CONFIG_SECURITY_NETWORK=y
|
||||
CONFIG_LSM_MMAP_MIN_ADDR=0
|
||||
CONFIG_SECURITY_SELINUX=y
|
||||
CONFIG_SECURITY_SELINUX_BOOTPARAM=y
|
||||
|
@ -646,10 +646,10 @@ enum bcm63xx_irq {
|
||||
#define BCM_6328_ENETSW_RXDMA1_IRQ (BCM_6328_HIGH_IRQ_BASE + 1)
|
||||
#define BCM_6328_ENETSW_RXDMA2_IRQ (BCM_6328_HIGH_IRQ_BASE + 2)
|
||||
#define BCM_6328_ENETSW_RXDMA3_IRQ (BCM_6328_HIGH_IRQ_BASE + 3)
|
||||
#define BCM_6328_ENETSW_TXDMA0_IRQ (BCM_6328_HIGH_IRQ_BASE + 4)
|
||||
#define BCM_6328_ENETSW_TXDMA1_IRQ (BCM_6328_HIGH_IRQ_BASE + 5)
|
||||
#define BCM_6328_ENETSW_TXDMA2_IRQ (BCM_6328_HIGH_IRQ_BASE + 6)
|
||||
#define BCM_6328_ENETSW_TXDMA3_IRQ (BCM_6328_HIGH_IRQ_BASE + 7)
|
||||
#define BCM_6328_ENETSW_TXDMA0_IRQ 0
|
||||
#define BCM_6328_ENETSW_TXDMA1_IRQ 0
|
||||
#define BCM_6328_ENETSW_TXDMA2_IRQ 0
|
||||
#define BCM_6328_ENETSW_TXDMA3_IRQ 0
|
||||
#define BCM_6328_XTM_IRQ (BCM_6328_HIGH_IRQ_BASE + 31)
|
||||
#define BCM_6328_XTM_DMA0_IRQ (BCM_6328_HIGH_IRQ_BASE + 11)
|
||||
|
||||
|
@ -161,6 +161,7 @@
|
||||
/* External Interrupt Configuration register */
|
||||
#define PERF_EXTIRQ_CFG_REG_6328 0x18
|
||||
#define PERF_EXTIRQ_CFG_REG_6338 0x14
|
||||
#define PERF_EXTIRQ_CFG_REG_6345 0x14
|
||||
#define PERF_EXTIRQ_CFG_REG_6348 0x14
|
||||
#define PERF_EXTIRQ_CFG_REG_6358 0x14
|
||||
#define PERF_EXTIRQ_CFG_REG_6368 0x18
|
||||
|
328
arch/mips/include/asm/octeon/cvmx-mpi-defs.h
Normal file
328
arch/mips/include/asm/octeon/cvmx-mpi-defs.h
Normal file
@ -0,0 +1,328 @@
|
||||
/***********************license start***************
|
||||
* Author: Cavium Networks
|
||||
*
|
||||
* Contact: support@caviumnetworks.com
|
||||
* This file is part of the OCTEON SDK
|
||||
*
|
||||
* Copyright (c) 2003-2012 Cavium Networks
|
||||
*
|
||||
* This file is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License, Version 2, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This file is distributed in the hope that it will be useful, but
|
||||
* AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
|
||||
* NONINFRINGEMENT. See the GNU General Public License for more
|
||||
* details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this file; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
* or visit http://www.gnu.org/licenses/.
|
||||
*
|
||||
* This file may also be available under a different license from Cavium.
|
||||
* Contact Cavium Networks for more information
|
||||
***********************license end**************************************/
|
||||
|
||||
#ifndef __CVMX_MPI_DEFS_H__
|
||||
#define __CVMX_MPI_DEFS_H__
|
||||
|
||||
#define CVMX_MPI_CFG (CVMX_ADD_IO_SEG(0x0001070000001000ull))
|
||||
#define CVMX_MPI_DATX(offset) (CVMX_ADD_IO_SEG(0x0001070000001080ull) + ((offset) & 15) * 8)
|
||||
#define CVMX_MPI_STS (CVMX_ADD_IO_SEG(0x0001070000001008ull))
|
||||
#define CVMX_MPI_TX (CVMX_ADD_IO_SEG(0x0001070000001010ull))
|
||||
|
||||
union cvmx_mpi_cfg {
|
||||
uint64_t u64;
|
||||
struct cvmx_mpi_cfg_s {
|
||||
#ifdef __BIG_ENDIAN_BITFIELD
|
||||
uint64_t reserved_29_63:35;
|
||||
uint64_t clkdiv:13;
|
||||
uint64_t csena3:1;
|
||||
uint64_t csena2:1;
|
||||
uint64_t csena1:1;
|
||||
uint64_t csena0:1;
|
||||
uint64_t cslate:1;
|
||||
uint64_t tritx:1;
|
||||
uint64_t idleclks:2;
|
||||
uint64_t cshi:1;
|
||||
uint64_t csena:1;
|
||||
uint64_t int_ena:1;
|
||||
uint64_t lsbfirst:1;
|
||||
uint64_t wireor:1;
|
||||
uint64_t clk_cont:1;
|
||||
uint64_t idlelo:1;
|
||||
uint64_t enable:1;
|
||||
#else
|
||||
uint64_t enable:1;
|
||||
uint64_t idlelo:1;
|
||||
uint64_t clk_cont:1;
|
||||
uint64_t wireor:1;
|
||||
uint64_t lsbfirst:1;
|
||||
uint64_t int_ena:1;
|
||||
uint64_t csena:1;
|
||||
uint64_t cshi:1;
|
||||
uint64_t idleclks:2;
|
||||
uint64_t tritx:1;
|
||||
uint64_t cslate:1;
|
||||
uint64_t csena0:1;
|
||||
uint64_t csena1:1;
|
||||
uint64_t csena2:1;
|
||||
uint64_t csena3:1;
|
||||
uint64_t clkdiv:13;
|
||||
uint64_t reserved_29_63:35;
|
||||
#endif
|
||||
} s;
|
||||
struct cvmx_mpi_cfg_cn30xx {
|
||||
#ifdef __BIG_ENDIAN_BITFIELD
|
||||
uint64_t reserved_29_63:35;
|
||||
uint64_t clkdiv:13;
|
||||
uint64_t reserved_12_15:4;
|
||||
uint64_t cslate:1;
|
||||
uint64_t tritx:1;
|
||||
uint64_t idleclks:2;
|
||||
uint64_t cshi:1;
|
||||
uint64_t csena:1;
|
||||
uint64_t int_ena:1;
|
||||
uint64_t lsbfirst:1;
|
||||
uint64_t wireor:1;
|
||||
uint64_t clk_cont:1;
|
||||
uint64_t idlelo:1;
|
||||
uint64_t enable:1;
|
||||
#else
|
||||
uint64_t enable:1;
|
||||
uint64_t idlelo:1;
|
||||
uint64_t clk_cont:1;
|
||||
uint64_t wireor:1;
|
||||
uint64_t lsbfirst:1;
|
||||
uint64_t int_ena:1;
|
||||
uint64_t csena:1;
|
||||
uint64_t cshi:1;
|
||||
uint64_t idleclks:2;
|
||||
uint64_t tritx:1;
|
||||
uint64_t cslate:1;
|
||||
uint64_t reserved_12_15:4;
|
||||
uint64_t clkdiv:13;
|
||||
uint64_t reserved_29_63:35;
|
||||
#endif
|
||||
} cn30xx;
|
||||
struct cvmx_mpi_cfg_cn31xx {
|
||||
#ifdef __BIG_ENDIAN_BITFIELD
|
||||
uint64_t reserved_29_63:35;
|
||||
uint64_t clkdiv:13;
|
||||
uint64_t reserved_11_15:5;
|
||||
uint64_t tritx:1;
|
||||
uint64_t idleclks:2;
|
||||
uint64_t cshi:1;
|
||||
uint64_t csena:1;
|
||||
uint64_t int_ena:1;
|
||||
uint64_t lsbfirst:1;
|
||||
uint64_t wireor:1;
|
||||
uint64_t clk_cont:1;
|
||||
uint64_t idlelo:1;
|
||||
uint64_t enable:1;
|
||||
#else
|
||||
uint64_t enable:1;
|
||||
uint64_t idlelo:1;
|
||||
uint64_t clk_cont:1;
|
||||
uint64_t wireor:1;
|
||||
uint64_t lsbfirst:1;
|
||||
uint64_t int_ena:1;
|
||||
uint64_t csena:1;
|
||||
uint64_t cshi:1;
|
||||
uint64_t idleclks:2;
|
||||
uint64_t tritx:1;
|
||||
uint64_t reserved_11_15:5;
|
||||
uint64_t clkdiv:13;
|
||||
uint64_t reserved_29_63:35;
|
||||
#endif
|
||||
} cn31xx;
|
||||
struct cvmx_mpi_cfg_cn30xx cn50xx;
|
||||
struct cvmx_mpi_cfg_cn61xx {
|
||||
#ifdef __BIG_ENDIAN_BITFIELD
|
||||
uint64_t reserved_29_63:35;
|
||||
uint64_t clkdiv:13;
|
||||
uint64_t reserved_14_15:2;
|
||||
uint64_t csena1:1;
|
||||
uint64_t csena0:1;
|
||||
uint64_t cslate:1;
|
||||
uint64_t tritx:1;
|
||||
uint64_t idleclks:2;
|
||||
uint64_t cshi:1;
|
||||
uint64_t reserved_6_6:1;
|
||||
uint64_t int_ena:1;
|
||||
uint64_t lsbfirst:1;
|
||||
uint64_t wireor:1;
|
||||
uint64_t clk_cont:1;
|
||||
uint64_t idlelo:1;
|
||||
uint64_t enable:1;
|
||||
#else
|
||||
uint64_t enable:1;
|
||||
uint64_t idlelo:1;
|
||||
uint64_t clk_cont:1;
|
||||
uint64_t wireor:1;
|
||||
uint64_t lsbfirst:1;
|
||||
uint64_t int_ena:1;
|
||||
uint64_t reserved_6_6:1;
|
||||
uint64_t cshi:1;
|
||||
uint64_t idleclks:2;
|
||||
uint64_t tritx:1;
|
||||
uint64_t cslate:1;
|
||||
uint64_t csena0:1;
|
||||
uint64_t csena1:1;
|
||||
uint64_t reserved_14_15:2;
|
||||
uint64_t clkdiv:13;
|
||||
uint64_t reserved_29_63:35;
|
||||
#endif
|
||||
} cn61xx;
|
||||
struct cvmx_mpi_cfg_cn66xx {
|
||||
#ifdef __BIG_ENDIAN_BITFIELD
|
||||
uint64_t reserved_29_63:35;
|
||||
uint64_t clkdiv:13;
|
||||
uint64_t csena3:1;
|
||||
uint64_t csena2:1;
|
||||
uint64_t reserved_12_13:2;
|
||||
uint64_t cslate:1;
|
||||
uint64_t tritx:1;
|
||||
uint64_t idleclks:2;
|
||||
uint64_t cshi:1;
|
||||
uint64_t reserved_6_6:1;
|
||||
uint64_t int_ena:1;
|
||||
uint64_t lsbfirst:1;
|
||||
uint64_t wireor:1;
|
||||
uint64_t clk_cont:1;
|
||||
uint64_t idlelo:1;
|
||||
uint64_t enable:1;
|
||||
#else
|
||||
uint64_t enable:1;
|
||||
uint64_t idlelo:1;
|
||||
uint64_t clk_cont:1;
|
||||
uint64_t wireor:1;
|
||||
uint64_t lsbfirst:1;
|
||||
uint64_t int_ena:1;
|
||||
uint64_t reserved_6_6:1;
|
||||
uint64_t cshi:1;
|
||||
uint64_t idleclks:2;
|
||||
uint64_t tritx:1;
|
||||
uint64_t cslate:1;
|
||||
uint64_t reserved_12_13:2;
|
||||
uint64_t csena2:1;
|
||||
uint64_t csena3:1;
|
||||
uint64_t clkdiv:13;
|
||||
uint64_t reserved_29_63:35;
|
||||
#endif
|
||||
} cn66xx;
|
||||
struct cvmx_mpi_cfg_cn61xx cnf71xx;
|
||||
};
|
||||
|
||||
union cvmx_mpi_datx {
|
||||
uint64_t u64;
|
||||
struct cvmx_mpi_datx_s {
|
||||
#ifdef __BIG_ENDIAN_BITFIELD
|
||||
uint64_t reserved_8_63:56;
|
||||
uint64_t data:8;
|
||||
#else
|
||||
uint64_t data:8;
|
||||
uint64_t reserved_8_63:56;
|
||||
#endif
|
||||
} s;
|
||||
struct cvmx_mpi_datx_s cn30xx;
|
||||
struct cvmx_mpi_datx_s cn31xx;
|
||||
struct cvmx_mpi_datx_s cn50xx;
|
||||
struct cvmx_mpi_datx_s cn61xx;
|
||||
struct cvmx_mpi_datx_s cn66xx;
|
||||
struct cvmx_mpi_datx_s cnf71xx;
|
||||
};
|
||||
|
||||
union cvmx_mpi_sts {
|
||||
uint64_t u64;
|
||||
struct cvmx_mpi_sts_s {
|
||||
#ifdef __BIG_ENDIAN_BITFIELD
|
||||
uint64_t reserved_13_63:51;
|
||||
uint64_t rxnum:5;
|
||||
uint64_t reserved_1_7:7;
|
||||
uint64_t busy:1;
|
||||
#else
|
||||
uint64_t busy:1;
|
||||
uint64_t reserved_1_7:7;
|
||||
uint64_t rxnum:5;
|
||||
uint64_t reserved_13_63:51;
|
||||
#endif
|
||||
} s;
|
||||
struct cvmx_mpi_sts_s cn30xx;
|
||||
struct cvmx_mpi_sts_s cn31xx;
|
||||
struct cvmx_mpi_sts_s cn50xx;
|
||||
struct cvmx_mpi_sts_s cn61xx;
|
||||
struct cvmx_mpi_sts_s cn66xx;
|
||||
struct cvmx_mpi_sts_s cnf71xx;
|
||||
};
|
||||
|
||||
union cvmx_mpi_tx {
|
||||
uint64_t u64;
|
||||
struct cvmx_mpi_tx_s {
|
||||
#ifdef __BIG_ENDIAN_BITFIELD
|
||||
uint64_t reserved_22_63:42;
|
||||
uint64_t csid:2;
|
||||
uint64_t reserved_17_19:3;
|
||||
uint64_t leavecs:1;
|
||||
uint64_t reserved_13_15:3;
|
||||
uint64_t txnum:5;
|
||||
uint64_t reserved_5_7:3;
|
||||
uint64_t totnum:5;
|
||||
#else
|
||||
uint64_t totnum:5;
|
||||
uint64_t reserved_5_7:3;
|
||||
uint64_t txnum:5;
|
||||
uint64_t reserved_13_15:3;
|
||||
uint64_t leavecs:1;
|
||||
uint64_t reserved_17_19:3;
|
||||
uint64_t csid:2;
|
||||
uint64_t reserved_22_63:42;
|
||||
#endif
|
||||
} s;
|
||||
struct cvmx_mpi_tx_cn30xx {
|
||||
#ifdef __BIG_ENDIAN_BITFIELD
|
||||
uint64_t reserved_17_63:47;
|
||||
uint64_t leavecs:1;
|
||||
uint64_t reserved_13_15:3;
|
||||
uint64_t txnum:5;
|
||||
uint64_t reserved_5_7:3;
|
||||
uint64_t totnum:5;
|
||||
#else
|
||||
uint64_t totnum:5;
|
||||
uint64_t reserved_5_7:3;
|
||||
uint64_t txnum:5;
|
||||
uint64_t reserved_13_15:3;
|
||||
uint64_t leavecs:1;
|
||||
uint64_t reserved_17_63:47;
|
||||
#endif
|
||||
} cn30xx;
|
||||
struct cvmx_mpi_tx_cn30xx cn31xx;
|
||||
struct cvmx_mpi_tx_cn30xx cn50xx;
|
||||
struct cvmx_mpi_tx_cn61xx {
|
||||
#ifdef __BIG_ENDIAN_BITFIELD
|
||||
uint64_t reserved_21_63:43;
|
||||
uint64_t csid:1;
|
||||
uint64_t reserved_17_19:3;
|
||||
uint64_t leavecs:1;
|
||||
uint64_t reserved_13_15:3;
|
||||
uint64_t txnum:5;
|
||||
uint64_t reserved_5_7:3;
|
||||
uint64_t totnum:5;
|
||||
#else
|
||||
uint64_t totnum:5;
|
||||
uint64_t reserved_5_7:3;
|
||||
uint64_t txnum:5;
|
||||
uint64_t reserved_13_15:3;
|
||||
uint64_t leavecs:1;
|
||||
uint64_t reserved_17_19:3;
|
||||
uint64_t csid:1;
|
||||
uint64_t reserved_21_63:43;
|
||||
#endif
|
||||
} cn61xx;
|
||||
struct cvmx_mpi_tx_s cn66xx;
|
||||
struct cvmx_mpi_tx_cn61xx cnf71xx;
|
||||
};
|
||||
|
||||
#endif
|
@ -34,28 +34,11 @@ obj-$(CONFIG_MODULES) += mips_ksyms.o module.o
|
||||
|
||||
obj-$(CONFIG_FUNCTION_TRACER) += mcount.o ftrace.o
|
||||
|
||||
obj-$(CONFIG_CPU_LOONGSON2) += r4k_fpu.o r4k_switch.o
|
||||
obj-$(CONFIG_CPU_MIPS32) += r4k_fpu.o r4k_switch.o
|
||||
obj-$(CONFIG_CPU_MIPS64) += r4k_fpu.o r4k_switch.o
|
||||
obj-$(CONFIG_CPU_R4K_FPU) += r4k_fpu.o r4k_switch.o
|
||||
obj-$(CONFIG_CPU_R3000) += r2300_fpu.o r2300_switch.o
|
||||
obj-$(CONFIG_CPU_R4300) += r4k_fpu.o r4k_switch.o
|
||||
obj-$(CONFIG_CPU_R4X00) += r4k_fpu.o r4k_switch.o
|
||||
obj-$(CONFIG_CPU_R5000) += r4k_fpu.o r4k_switch.o
|
||||
obj-$(CONFIG_CPU_R6000) += r6000_fpu.o r4k_switch.o
|
||||
obj-$(CONFIG_CPU_R5432) += r4k_fpu.o r4k_switch.o
|
||||
obj-$(CONFIG_CPU_R5500) += r4k_fpu.o r4k_switch.o
|
||||
obj-$(CONFIG_CPU_R8000) += r4k_fpu.o r4k_switch.o
|
||||
obj-$(CONFIG_CPU_RM7000) += r4k_fpu.o r4k_switch.o
|
||||
obj-$(CONFIG_CPU_RM9000) += r4k_fpu.o r4k_switch.o
|
||||
obj-$(CONFIG_CPU_NEVADA) += r4k_fpu.o r4k_switch.o
|
||||
obj-$(CONFIG_CPU_R10000) += r4k_fpu.o r4k_switch.o
|
||||
obj-$(CONFIG_CPU_SB1) += r4k_fpu.o r4k_switch.o
|
||||
obj-$(CONFIG_CPU_TX39XX) += r2300_fpu.o r2300_switch.o
|
||||
obj-$(CONFIG_CPU_TX49XX) += r4k_fpu.o r4k_switch.o
|
||||
obj-$(CONFIG_CPU_VR41XX) += r4k_fpu.o r4k_switch.o
|
||||
obj-$(CONFIG_CPU_CAVIUM_OCTEON) += octeon_switch.o
|
||||
obj-$(CONFIG_CPU_XLR) += r4k_fpu.o r4k_switch.o
|
||||
obj-$(CONFIG_CPU_XLP) += r4k_fpu.o r4k_switch.o
|
||||
|
||||
obj-$(CONFIG_SMP) += smp.o
|
||||
obj-$(CONFIG_SMP_UP) += smp-up.o
|
||||
|
@ -150,6 +150,7 @@ static void vsmp_send_ipi_mask(const struct cpumask *mask, unsigned int action)
|
||||
|
||||
static void __cpuinit vsmp_init_secondary(void)
|
||||
{
|
||||
#ifdef CONFIG_IRQ_GIC
|
||||
extern int gic_present;
|
||||
|
||||
/* This is Malta specific: IPI,performance and timer interrupts */
|
||||
@ -157,6 +158,7 @@ static void __cpuinit vsmp_init_secondary(void)
|
||||
change_c0_status(ST0_IM, STATUSF_IP3 | STATUSF_IP4 |
|
||||
STATUSF_IP6 | STATUSF_IP7);
|
||||
else
|
||||
#endif
|
||||
change_c0_status(ST0_IM, STATUSF_IP0 | STATUSF_IP1 |
|
||||
STATUSF_IP6 | STATUSF_IP7);
|
||||
}
|
||||
|
@ -188,10 +188,12 @@ static int clkout_enable(struct clk *clk)
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (clk->rates[i] == clk->rate) {
|
||||
int shift = 14 - (2 * clk->module);
|
||||
int enable = 7 - clk->module;
|
||||
unsigned int val = ltq_cgu_r32(ifccr);
|
||||
|
||||
val &= ~(3 << shift);
|
||||
val |= i << shift;
|
||||
val |= enable;
|
||||
ltq_cgu_w32(val, ifccr);
|
||||
return 0;
|
||||
}
|
||||
|
@ -8,28 +8,9 @@ lib-y += csum_partial.o delay.o memcpy.o memset.o \
|
||||
obj-y += iomap.o
|
||||
obj-$(CONFIG_PCI) += iomap-pci.o
|
||||
|
||||
obj-$(CONFIG_CPU_LOONGSON2) += dump_tlb.o
|
||||
obj-$(CONFIG_CPU_MIPS32) += dump_tlb.o
|
||||
obj-$(CONFIG_CPU_MIPS64) += dump_tlb.o
|
||||
obj-$(CONFIG_CPU_NEVADA) += dump_tlb.o
|
||||
obj-$(CONFIG_CPU_R10000) += dump_tlb.o
|
||||
obj-$(CONFIG_CPU_GENERIC_DUMP_TLB) += dump_tlb.o
|
||||
obj-$(CONFIG_CPU_R3000) += r3k_dump_tlb.o
|
||||
obj-$(CONFIG_CPU_R4300) += dump_tlb.o
|
||||
obj-$(CONFIG_CPU_R4X00) += dump_tlb.o
|
||||
obj-$(CONFIG_CPU_R5000) += dump_tlb.o
|
||||
obj-$(CONFIG_CPU_R5432) += dump_tlb.o
|
||||
obj-$(CONFIG_CPU_R5500) += dump_tlb.o
|
||||
obj-$(CONFIG_CPU_R6000) +=
|
||||
obj-$(CONFIG_CPU_R8000) +=
|
||||
obj-$(CONFIG_CPU_RM7000) += dump_tlb.o
|
||||
obj-$(CONFIG_CPU_RM9000) += dump_tlb.o
|
||||
obj-$(CONFIG_CPU_SB1) += dump_tlb.o
|
||||
obj-$(CONFIG_CPU_TX39XX) += r3k_dump_tlb.o
|
||||
obj-$(CONFIG_CPU_TX49XX) += dump_tlb.o
|
||||
obj-$(CONFIG_CPU_VR41XX) += dump_tlb.o
|
||||
obj-$(CONFIG_CPU_CAVIUM_OCTEON) += dump_tlb.o
|
||||
obj-$(CONFIG_CPU_XLR) += dump_tlb.o
|
||||
obj-$(CONFIG_CPU_XLP) += dump_tlb.o
|
||||
|
||||
# libgcc-style stuff needed in the kernel
|
||||
obj-y += ashldi3.o ashrdi3.o cmpdi2.o lshrdi3.o ucmpdi2.o
|
||||
|
@ -11,27 +11,12 @@ obj-$(CONFIG_64BIT) += pgtable-64.o
|
||||
obj-$(CONFIG_HIGHMEM) += highmem.o
|
||||
obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o
|
||||
|
||||
obj-$(CONFIG_CPU_LOONGSON2) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||
obj-$(CONFIG_CPU_MIPS32) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||
obj-$(CONFIG_CPU_MIPS64) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||
obj-$(CONFIG_CPU_NEVADA) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||
obj-$(CONFIG_CPU_R10000) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||
obj-$(CONFIG_CPU_R4K_CACHE_TLB) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||
obj-$(CONFIG_CPU_R3000) += c-r3k.o tlb-r3k.o
|
||||
obj-$(CONFIG_CPU_R4300) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||
obj-$(CONFIG_CPU_R4X00) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||
obj-$(CONFIG_CPU_R5000) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||
obj-$(CONFIG_CPU_R5432) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||
obj-$(CONFIG_CPU_R5500) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||
obj-$(CONFIG_CPU_R8000) += c-r4k.o cex-gen.o tlb-r8k.o
|
||||
obj-$(CONFIG_CPU_RM7000) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||
obj-$(CONFIG_CPU_RM9000) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||
obj-$(CONFIG_CPU_SB1) += c-r4k.o cerr-sb1.o cex-sb1.o tlb-r4k.o
|
||||
obj-$(CONFIG_CPU_TX39XX) += c-tx39.o tlb-r3k.o
|
||||
obj-$(CONFIG_CPU_TX49XX) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||
obj-$(CONFIG_CPU_VR41XX) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||
obj-$(CONFIG_CPU_CAVIUM_OCTEON) += c-octeon.o cex-oct.o tlb-r4k.o
|
||||
obj-$(CONFIG_CPU_XLR) += c-r4k.o tlb-r4k.o cex-gen.o
|
||||
obj-$(CONFIG_CPU_XLP) += c-r4k.o tlb-r4k.o cex-gen.o
|
||||
|
||||
obj-$(CONFIG_IP22_CPU_SCACHE) += sc-ip22.o
|
||||
obj-$(CONFIG_R5000_CPU_SCACHE) += sc-r5k.o
|
||||
|
@ -1,2 +1,17 @@
|
||||
if NLM_XLP_BOARD || NLM_XLR_BOARD
|
||||
|
||||
if NLM_XLP_BOARD
|
||||
config DT_XLP_EVP
|
||||
bool "Built-in device tree for XLP EVP/SVP boards"
|
||||
default y
|
||||
help
|
||||
Add an FDT blob for XLP EVP and SVP boards into the kernel.
|
||||
This DTB will be used if the firmware does not pass in a DTB
|
||||
pointer to the kernel. The corresponding DTS file is at
|
||||
arch/mips/netlogic/dts/xlp_evp.dts
|
||||
endif
|
||||
|
||||
config NLM_COMMON
|
||||
bool
|
||||
|
||||
endif
|
||||
|
@ -1,3 +1,4 @@
|
||||
obj-$(CONFIG_NLM_COMMON) += common/
|
||||
obj-$(CONFIG_CPU_XLR) += xlr/
|
||||
obj-$(CONFIG_CPU_XLP) += xlp/
|
||||
obj-$(CONFIG_CPU_XLP) += dts/
|
||||
|
4
arch/mips/netlogic/dts/Makefile
Normal file
4
arch/mips/netlogic/dts/Makefile
Normal file
@ -0,0 +1,4 @@
|
||||
obj-$(CONFIG_DT_XLP_EVP) := xlp_evp.dtb.o
|
||||
|
||||
$(obj)/%.dtb: $(obj)/%.dts
|
||||
$(call if_changed,dtc)
|
124
arch/mips/netlogic/dts/xlp_evp.dts
Normal file
124
arch/mips/netlogic/dts/xlp_evp.dts
Normal file
@ -0,0 +1,124 @@
|
||||
/*
|
||||
* XLP8XX Device Tree Source for EVP boards
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
/ {
|
||||
model = "netlogic,XLP-EVP";
|
||||
compatible = "netlogic,xlp";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0 0x00100000 0 0x0FF00000 // 255M at 1M
|
||||
0 0x20000000 0 0xa0000000 // 2560M at 512M
|
||||
0 0xe0000000 1 0x00000000>;
|
||||
};
|
||||
|
||||
soc {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
compatible = "simple-bus";
|
||||
ranges = <0 0 0 0x18000000 0x04000000 // PCIe CFG
|
||||
1 0 0 0x16000000 0x01000000>; // GBU chipselects
|
||||
|
||||
serial0: serial@30000 {
|
||||
device_type = "serial";
|
||||
compatible = "ns16550";
|
||||
reg = <0 0x30100 0xa00>;
|
||||
reg-shift = <2>;
|
||||
reg-io-width = <4>;
|
||||
clock-frequency = <133333333>;
|
||||
interrupt-parent = <&pic>;
|
||||
interrupts = <17>;
|
||||
};
|
||||
serial1: serial@31000 {
|
||||
device_type = "serial";
|
||||
compatible = "ns16550";
|
||||
reg = <0 0x31100 0xa00>;
|
||||
reg-shift = <2>;
|
||||
reg-io-width = <4>;
|
||||
clock-frequency = <133333333>;
|
||||
interrupt-parent = <&pic>;
|
||||
interrupts = <18>;
|
||||
};
|
||||
i2c0: ocores@32000 {
|
||||
compatible = "opencores,i2c-ocores";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0 0x32100 0xa00>;
|
||||
reg-shift = <2>;
|
||||
reg-io-width = <4>;
|
||||
clock-frequency = <32000000>;
|
||||
interrupt-parent = <&pic>;
|
||||
interrupts = <30>;
|
||||
};
|
||||
i2c1: ocores@33000 {
|
||||
compatible = "opencores,i2c-ocores";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0 0x33100 0xa00>;
|
||||
reg-shift = <2>;
|
||||
reg-io-width = <4>;
|
||||
clock-frequency = <32000000>;
|
||||
interrupt-parent = <&pic>;
|
||||
interrupts = <31>;
|
||||
|
||||
rtc@68 {
|
||||
compatible = "dallas,ds1374";
|
||||
reg = <0x68>;
|
||||
};
|
||||
|
||||
dtt@4c {
|
||||
compatible = "national,lm90";
|
||||
reg = <0x4c>;
|
||||
};
|
||||
};
|
||||
pic: pic@4000 {
|
||||
interrupt-controller;
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <1>;
|
||||
reg = <0 0x4000 0x200>;
|
||||
};
|
||||
|
||||
nor_flash@1,0 {
|
||||
compatible = "cfi-flash";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
bank-width = <2>;
|
||||
reg = <1 0 0x1000000>;
|
||||
|
||||
partition@0 {
|
||||
label = "x-loader";
|
||||
reg = <0x0 0x100000>; /* 1M */
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@100000 {
|
||||
label = "u-boot";
|
||||
reg = <0x100000 0x100000>; /* 1M */
|
||||
};
|
||||
|
||||
partition@200000 {
|
||||
label = "kernel";
|
||||
reg = <0x200000 0x500000>; /* 5M */
|
||||
};
|
||||
|
||||
partition@700000 {
|
||||
label = "rootfs";
|
||||
reg = <0x700000 0x800000>; /* 8M */
|
||||
};
|
||||
|
||||
partition@f00000 {
|
||||
label = "env";
|
||||
reg = <0xf00000 0x100000>; /* 1M */
|
||||
read-only;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200 rdinit=/sbin/init";
|
||||
};
|
||||
};
|
@ -1,4 +1,3 @@
|
||||
obj-y += setup.o platform.o nlm_hal.o
|
||||
obj-$(CONFIG_OF) += of.o
|
||||
obj-y += setup.o nlm_hal.o
|
||||
obj-$(CONFIG_SMP) += wakeup.o
|
||||
obj-$(CONFIG_USB) += usb-init.o
|
||||
|
@ -1,34 +0,0 @@
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/of_fdt.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
static int __init reserve_mem_mach(unsigned long addr, unsigned long size)
|
||||
{
|
||||
return reserve_bootmem(addr, size, BOOTMEM_DEFAULT);
|
||||
}
|
||||
|
||||
void __init free_mem_mach(unsigned long addr, unsigned long size)
|
||||
{
|
||||
return free_bootmem(addr, size);
|
||||
}
|
||||
|
||||
void __init device_tree_init(void)
|
||||
{
|
||||
unsigned long base, size;
|
||||
|
||||
if (!initial_boot_params)
|
||||
return;
|
||||
|
||||
base = virt_to_phys((void *)initial_boot_params);
|
||||
size = be32_to_cpu(initial_boot_params->totalsize);
|
||||
|
||||
/* Before we do anything, lets reserve the dt blob */
|
||||
reserve_mem_mach(base, size);
|
||||
|
||||
unflatten_device_tree();
|
||||
|
||||
/* free the space reserved for the dt blob */
|
||||
free_mem_mach(base, size);
|
||||
}
|
@ -1,108 +0,0 @@
|
||||
/*
|
||||
* Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
|
||||
* reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
* General Public License (GPL) Version 2, available from the file
|
||||
* COPYING in the main directory of this source tree, or the NetLogic
|
||||
* license below:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/serial_reg.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#include <asm/time.h>
|
||||
#include <asm/addrspace.h>
|
||||
#include <asm/netlogic/haldefs.h>
|
||||
#include <asm/netlogic/xlp-hal/iomap.h>
|
||||
#include <asm/netlogic/xlp-hal/xlp.h>
|
||||
#include <asm/netlogic/xlp-hal/pic.h>
|
||||
#include <asm/netlogic/xlp-hal/uart.h>
|
||||
|
||||
static unsigned int nlm_xlp_uart_in(struct uart_port *p, int offset)
|
||||
{
|
||||
return nlm_read_reg(p->iobase, offset);
|
||||
}
|
||||
|
||||
static void nlm_xlp_uart_out(struct uart_port *p, int offset, int value)
|
||||
{
|
||||
nlm_write_reg(p->iobase, offset, value);
|
||||
}
|
||||
|
||||
#define PORT(_irq) \
|
||||
{ \
|
||||
.irq = _irq, \
|
||||
.regshift = 2, \
|
||||
.iotype = UPIO_MEM32, \
|
||||
.flags = (UPF_SKIP_TEST|UPF_FIXED_TYPE|\
|
||||
UPF_BOOT_AUTOCONF), \
|
||||
.uartclk = XLP_IO_CLK, \
|
||||
.type = PORT_16550A, \
|
||||
.serial_in = nlm_xlp_uart_in, \
|
||||
.serial_out = nlm_xlp_uart_out, \
|
||||
}
|
||||
|
||||
static struct plat_serial8250_port xlp_uart_data[] = {
|
||||
PORT(PIC_UART_0_IRQ),
|
||||
PORT(PIC_UART_1_IRQ),
|
||||
{},
|
||||
};
|
||||
|
||||
static struct platform_device uart_device = {
|
||||
.name = "serial8250",
|
||||
.id = PLAT8250_DEV_PLATFORM,
|
||||
.dev = {
|
||||
.platform_data = xlp_uart_data,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init nlm_platform_uart_init(void)
|
||||
{
|
||||
unsigned long mmio;
|
||||
|
||||
mmio = (unsigned long)nlm_get_uart_regbase(0, 0);
|
||||
xlp_uart_data[0].iobase = mmio;
|
||||
xlp_uart_data[0].membase = (void __iomem *)mmio;
|
||||
xlp_uart_data[0].mapbase = mmio;
|
||||
|
||||
mmio = (unsigned long)nlm_get_uart_regbase(0, 1);
|
||||
xlp_uart_data[1].iobase = mmio;
|
||||
xlp_uart_data[1].membase = (void __iomem *)mmio;
|
||||
xlp_uart_data[1].mapbase = mmio;
|
||||
|
||||
return platform_device_register(&uart_device);
|
||||
}
|
||||
|
||||
arch_initcall(nlm_platform_uart_init);
|
@ -35,6 +35,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/bootmem.h>
|
||||
|
||||
#include <asm/reboot.h>
|
||||
#include <asm/time.h>
|
||||
@ -56,6 +57,7 @@ unsigned long nlm_common_ebase = 0x0;
|
||||
/* default to uniprocessor */
|
||||
uint32_t nlm_coremask = 1, nlm_cpumask = 1;
|
||||
int nlm_threads_per_core = 1;
|
||||
extern u32 __dtb_start[];
|
||||
|
||||
static void nlm_linux_exit(void)
|
||||
{
|
||||
@ -96,9 +98,18 @@ void __init prom_init(void)
|
||||
{
|
||||
void *fdtp;
|
||||
|
||||
fdtp = (void *)(long)fw_arg0;
|
||||
xlp_mmu_init();
|
||||
nlm_hal_init();
|
||||
|
||||
/*
|
||||
* If no FDT pointer is passed in, use the built-in FDT.
|
||||
* device_tree_init() does not handle CKSEG0 pointers in
|
||||
* 64-bit, so convert pointer.
|
||||
*/
|
||||
fdtp = (void *)(long)fw_arg0;
|
||||
if (!fdtp)
|
||||
fdtp = __dtb_start;
|
||||
fdtp = phys_to_virt(__pa(fdtp));
|
||||
early_init_devtree(fdtp);
|
||||
|
||||
nlm_common_ebase = read_c0_ebase() & (~((1 << 12) - 1));
|
||||
@ -112,6 +123,25 @@ void __init prom_init(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
void __init device_tree_init(void)
|
||||
{
|
||||
unsigned long base, size;
|
||||
|
||||
if (!initial_boot_params)
|
||||
return;
|
||||
|
||||
base = virt_to_phys((void *)initial_boot_params);
|
||||
size = be32_to_cpu(initial_boot_params->totalsize);
|
||||
|
||||
/* Before we do anything, lets reserve the dt blob */
|
||||
reserve_bootmem(base, size, BOOTMEM_DEFAULT);
|
||||
|
||||
unflatten_device_tree();
|
||||
|
||||
/* free the space reserved for the dt blob */
|
||||
free_bootmem(base, size);
|
||||
}
|
||||
|
||||
static struct of_device_id __initdata xlp_ids[] = {
|
||||
{ .compatible = "simple-bus", },
|
||||
{},
|
||||
|
@ -237,6 +237,13 @@ config SPI_OC_TINY
|
||||
help
|
||||
This is the driver for OpenCores tiny SPI master controller.
|
||||
|
||||
config SPI_OCTEON
|
||||
tristate "Cavium OCTEON SPI controller"
|
||||
depends on CPU_CAVIUM_OCTEON
|
||||
help
|
||||
SPI host driver for the hardware found on some Cavium OCTEON
|
||||
SOCs.
|
||||
|
||||
config SPI_OMAP_UWIRE
|
||||
tristate "OMAP1 MicroWire"
|
||||
depends on ARCH_OMAP1
|
||||
|
@ -38,6 +38,7 @@ obj-$(CONFIG_SPI_MPC52xx_PSC) += spi-mpc52xx-psc.o
|
||||
obj-$(CONFIG_SPI_MPC52xx) += spi-mpc52xx.o
|
||||
obj-$(CONFIG_SPI_NUC900) += spi-nuc900.o
|
||||
obj-$(CONFIG_SPI_OC_TINY) += spi-oc-tiny.o
|
||||
obj-$(CONFIG_SPI_OCTEON) += spi-octeon.o
|
||||
obj-$(CONFIG_SPI_OMAP_UWIRE) += spi-omap-uwire.o
|
||||
obj-$(CONFIG_SPI_OMAP_100K) += spi-omap-100k.o
|
||||
obj-$(CONFIG_SPI_OMAP24XX) += spi-omap2-mcspi.o
|
||||
|
362
drivers/spi/spi-octeon.c
Normal file
362
drivers/spi/spi-octeon.c
Normal file
@ -0,0 +1,362 @@
|
||||
/*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
* Copyright (C) 2011, 2012 Cavium, Inc.
|
||||
*/
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/of.h>
|
||||
|
||||
#include <asm/octeon/octeon.h>
|
||||
#include <asm/octeon/cvmx-mpi-defs.h>
|
||||
|
||||
#define OCTEON_SPI_CFG 0
|
||||
#define OCTEON_SPI_STS 0x08
|
||||
#define OCTEON_SPI_TX 0x10
|
||||
#define OCTEON_SPI_DAT0 0x80
|
||||
|
||||
#define OCTEON_SPI_MAX_BYTES 9
|
||||
|
||||
#define OCTEON_SPI_MAX_CLOCK_HZ 16000000
|
||||
|
||||
struct octeon_spi {
|
||||
struct spi_master *my_master;
|
||||
u64 register_base;
|
||||
u64 last_cfg;
|
||||
u64 cs_enax;
|
||||
};
|
||||
|
||||
struct octeon_spi_setup {
|
||||
u32 max_speed_hz;
|
||||
u8 chip_select;
|
||||
u8 mode;
|
||||
u8 bits_per_word;
|
||||
};
|
||||
|
||||
static void octeon_spi_wait_ready(struct octeon_spi *p)
|
||||
{
|
||||
union cvmx_mpi_sts mpi_sts;
|
||||
unsigned int loops = 0;
|
||||
|
||||
do {
|
||||
if (loops++)
|
||||
__delay(500);
|
||||
mpi_sts.u64 = cvmx_read_csr(p->register_base + OCTEON_SPI_STS);
|
||||
} while (mpi_sts.s.busy);
|
||||
}
|
||||
|
||||
static int octeon_spi_do_transfer(struct octeon_spi *p,
|
||||
struct spi_message *msg,
|
||||
struct spi_transfer *xfer,
|
||||
bool last_xfer)
|
||||
{
|
||||
union cvmx_mpi_cfg mpi_cfg;
|
||||
union cvmx_mpi_tx mpi_tx;
|
||||
unsigned int clkdiv;
|
||||
unsigned int speed_hz;
|
||||
int mode;
|
||||
bool cpha, cpol;
|
||||
int bits_per_word;
|
||||
const u8 *tx_buf;
|
||||
u8 *rx_buf;
|
||||
int len;
|
||||
int i;
|
||||
|
||||
struct octeon_spi_setup *msg_setup = spi_get_ctldata(msg->spi);
|
||||
|
||||
speed_hz = msg_setup->max_speed_hz;
|
||||
mode = msg_setup->mode;
|
||||
cpha = mode & SPI_CPHA;
|
||||
cpol = mode & SPI_CPOL;
|
||||
bits_per_word = msg_setup->bits_per_word;
|
||||
|
||||
if (xfer->speed_hz)
|
||||
speed_hz = xfer->speed_hz;
|
||||
if (xfer->bits_per_word)
|
||||
bits_per_word = xfer->bits_per_word;
|
||||
|
||||
if (speed_hz > OCTEON_SPI_MAX_CLOCK_HZ)
|
||||
speed_hz = OCTEON_SPI_MAX_CLOCK_HZ;
|
||||
|
||||
clkdiv = octeon_get_io_clock_rate() / (2 * speed_hz);
|
||||
|
||||
mpi_cfg.u64 = 0;
|
||||
|
||||
mpi_cfg.s.clkdiv = clkdiv;
|
||||
mpi_cfg.s.cshi = (mode & SPI_CS_HIGH) ? 1 : 0;
|
||||
mpi_cfg.s.lsbfirst = (mode & SPI_LSB_FIRST) ? 1 : 0;
|
||||
mpi_cfg.s.wireor = (mode & SPI_3WIRE) ? 1 : 0;
|
||||
mpi_cfg.s.idlelo = cpha != cpol;
|
||||
mpi_cfg.s.cslate = cpha ? 1 : 0;
|
||||
mpi_cfg.s.enable = 1;
|
||||
|
||||
if (msg_setup->chip_select < 4)
|
||||
p->cs_enax |= 1ull << (12 + msg_setup->chip_select);
|
||||
mpi_cfg.u64 |= p->cs_enax;
|
||||
|
||||
if (mpi_cfg.u64 != p->last_cfg) {
|
||||
p->last_cfg = mpi_cfg.u64;
|
||||
cvmx_write_csr(p->register_base + OCTEON_SPI_CFG, mpi_cfg.u64);
|
||||
}
|
||||
tx_buf = xfer->tx_buf;
|
||||
rx_buf = xfer->rx_buf;
|
||||
len = xfer->len;
|
||||
while (len > OCTEON_SPI_MAX_BYTES) {
|
||||
for (i = 0; i < OCTEON_SPI_MAX_BYTES; i++) {
|
||||
u8 d;
|
||||
if (tx_buf)
|
||||
d = *tx_buf++;
|
||||
else
|
||||
d = 0;
|
||||
cvmx_write_csr(p->register_base + OCTEON_SPI_DAT0 + (8 * i), d);
|
||||
}
|
||||
mpi_tx.u64 = 0;
|
||||
mpi_tx.s.csid = msg_setup->chip_select;
|
||||
mpi_tx.s.leavecs = 1;
|
||||
mpi_tx.s.txnum = tx_buf ? OCTEON_SPI_MAX_BYTES : 0;
|
||||
mpi_tx.s.totnum = OCTEON_SPI_MAX_BYTES;
|
||||
cvmx_write_csr(p->register_base + OCTEON_SPI_TX, mpi_tx.u64);
|
||||
|
||||
octeon_spi_wait_ready(p);
|
||||
if (rx_buf)
|
||||
for (i = 0; i < OCTEON_SPI_MAX_BYTES; i++) {
|
||||
u64 v = cvmx_read_csr(p->register_base + OCTEON_SPI_DAT0 + (8 * i));
|
||||
*rx_buf++ = (u8)v;
|
||||
}
|
||||
len -= OCTEON_SPI_MAX_BYTES;
|
||||
}
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
u8 d;
|
||||
if (tx_buf)
|
||||
d = *tx_buf++;
|
||||
else
|
||||
d = 0;
|
||||
cvmx_write_csr(p->register_base + OCTEON_SPI_DAT0 + (8 * i), d);
|
||||
}
|
||||
|
||||
mpi_tx.u64 = 0;
|
||||
mpi_tx.s.csid = msg_setup->chip_select;
|
||||
if (last_xfer)
|
||||
mpi_tx.s.leavecs = xfer->cs_change;
|
||||
else
|
||||
mpi_tx.s.leavecs = !xfer->cs_change;
|
||||
mpi_tx.s.txnum = tx_buf ? len : 0;
|
||||
mpi_tx.s.totnum = len;
|
||||
cvmx_write_csr(p->register_base + OCTEON_SPI_TX, mpi_tx.u64);
|
||||
|
||||
octeon_spi_wait_ready(p);
|
||||
if (rx_buf)
|
||||
for (i = 0; i < len; i++) {
|
||||
u64 v = cvmx_read_csr(p->register_base + OCTEON_SPI_DAT0 + (8 * i));
|
||||
*rx_buf++ = (u8)v;
|
||||
}
|
||||
|
||||
if (xfer->delay_usecs)
|
||||
udelay(xfer->delay_usecs);
|
||||
|
||||
return xfer->len;
|
||||
}
|
||||
|
||||
static int octeon_spi_validate_bpw(struct spi_device *spi, u32 speed)
|
||||
{
|
||||
switch (speed) {
|
||||
case 8:
|
||||
break;
|
||||
default:
|
||||
dev_err(&spi->dev, "Error: %d bits per word not supported\n",
|
||||
speed);
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int octeon_spi_transfer_one_message(struct spi_master *master,
|
||||
struct spi_message *msg)
|
||||
{
|
||||
struct octeon_spi *p = spi_master_get_devdata(master);
|
||||
unsigned int total_len = 0;
|
||||
int status = 0;
|
||||
struct spi_transfer *xfer;
|
||||
|
||||
/*
|
||||
* We better have set the configuration via a call to .setup
|
||||
* before we get here.
|
||||
*/
|
||||
if (spi_get_ctldata(msg->spi) == NULL) {
|
||||
status = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
list_for_each_entry(xfer, &msg->transfers, transfer_list) {
|
||||
if (xfer->bits_per_word) {
|
||||
status = octeon_spi_validate_bpw(msg->spi,
|
||||
xfer->bits_per_word);
|
||||
if (status)
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
list_for_each_entry(xfer, &msg->transfers, transfer_list) {
|
||||
bool last_xfer = &xfer->transfer_list == msg->transfers.prev;
|
||||
int r = octeon_spi_do_transfer(p, msg, xfer, last_xfer);
|
||||
if (r < 0) {
|
||||
status = r;
|
||||
goto err;
|
||||
}
|
||||
total_len += r;
|
||||
}
|
||||
err:
|
||||
msg->status = status;
|
||||
msg->actual_length = total_len;
|
||||
spi_finalize_current_message(master);
|
||||
return status;
|
||||
}
|
||||
|
||||
static struct octeon_spi_setup *octeon_spi_new_setup(struct spi_device *spi)
|
||||
{
|
||||
struct octeon_spi_setup *setup = kzalloc(sizeof(*setup), GFP_KERNEL);
|
||||
if (!setup)
|
||||
return NULL;
|
||||
|
||||
setup->max_speed_hz = spi->max_speed_hz;
|
||||
setup->chip_select = spi->chip_select;
|
||||
setup->mode = spi->mode;
|
||||
setup->bits_per_word = spi->bits_per_word;
|
||||
return setup;
|
||||
}
|
||||
|
||||
static int octeon_spi_setup(struct spi_device *spi)
|
||||
{
|
||||
int r;
|
||||
struct octeon_spi_setup *new_setup;
|
||||
struct octeon_spi_setup *old_setup = spi_get_ctldata(spi);
|
||||
|
||||
r = octeon_spi_validate_bpw(spi, spi->bits_per_word);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
new_setup = octeon_spi_new_setup(spi);
|
||||
if (!new_setup)
|
||||
return -ENOMEM;
|
||||
|
||||
spi_set_ctldata(spi, new_setup);
|
||||
kfree(old_setup);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void octeon_spi_cleanup(struct spi_device *spi)
|
||||
{
|
||||
struct octeon_spi_setup *old_setup = spi_get_ctldata(spi);
|
||||
spi_set_ctldata(spi, NULL);
|
||||
kfree(old_setup);
|
||||
}
|
||||
|
||||
static int octeon_spi_nop_transfer_hardware(struct spi_master *master)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit octeon_spi_probe(struct platform_device *pdev)
|
||||
{
|
||||
|
||||
struct resource *res_mem;
|
||||
struct spi_master *master;
|
||||
struct octeon_spi *p;
|
||||
int err = -ENOENT;
|
||||
|
||||
master = spi_alloc_master(&pdev->dev, sizeof(struct octeon_spi));
|
||||
if (!master)
|
||||
return -ENOMEM;
|
||||
p = spi_master_get_devdata(master);
|
||||
platform_set_drvdata(pdev, p);
|
||||
p->my_master = master;
|
||||
|
||||
res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
|
||||
if (res_mem == NULL) {
|
||||
dev_err(&pdev->dev, "found no memory resource\n");
|
||||
err = -ENXIO;
|
||||
goto fail;
|
||||
}
|
||||
if (!devm_request_mem_region(&pdev->dev, res_mem->start,
|
||||
resource_size(res_mem), res_mem->name)) {
|
||||
dev_err(&pdev->dev, "request_mem_region failed\n");
|
||||
goto fail;
|
||||
}
|
||||
p->register_base = (u64)devm_ioremap(&pdev->dev, res_mem->start,
|
||||
resource_size(res_mem));
|
||||
|
||||
/* Dynamic bus numbering */
|
||||
master->bus_num = -1;
|
||||
master->num_chipselect = 4;
|
||||
master->mode_bits = SPI_CPHA |
|
||||
SPI_CPOL |
|
||||
SPI_CS_HIGH |
|
||||
SPI_LSB_FIRST |
|
||||
SPI_3WIRE;
|
||||
|
||||
master->setup = octeon_spi_setup;
|
||||
master->cleanup = octeon_spi_cleanup;
|
||||
master->prepare_transfer_hardware = octeon_spi_nop_transfer_hardware;
|
||||
master->transfer_one_message = octeon_spi_transfer_one_message;
|
||||
master->unprepare_transfer_hardware = octeon_spi_nop_transfer_hardware;
|
||||
|
||||
master->dev.of_node = pdev->dev.of_node;
|
||||
err = spi_register_master(master);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "register master failed: %d\n", err);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
dev_info(&pdev->dev, "OCTEON SPI bus driver\n");
|
||||
|
||||
return 0;
|
||||
fail:
|
||||
spi_master_put(master);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __devexit octeon_spi_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct octeon_spi *p = platform_get_drvdata(pdev);
|
||||
u64 register_base = p->register_base;
|
||||
|
||||
spi_unregister_master(p->my_master);
|
||||
|
||||
/* Clear the CSENA* and put everything in a known state. */
|
||||
cvmx_write_csr(register_base + OCTEON_SPI_CFG, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct of_device_id octeon_spi_match[] = {
|
||||
{ .compatible = "cavium,octeon-3010-spi", },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, octeon_spi_match);
|
||||
|
||||
static struct platform_driver octeon_spi_driver = {
|
||||
.driver = {
|
||||
.name = "spi-octeon",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = octeon_spi_match,
|
||||
},
|
||||
.probe = octeon_spi_probe,
|
||||
.remove = __devexit_p(octeon_spi_remove),
|
||||
};
|
||||
|
||||
module_platform_driver(octeon_spi_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Cavium, Inc. OCTEON SPI bus driver");
|
||||
MODULE_AUTHOR("David Daney");
|
||||
MODULE_LICENSE("GPL");
|
Loading…
Reference in New Issue
Block a user