diff options
author | Santosh Shilimkar <santosh.shilimkar@ti.com> | 2014-08-15 11:43:49 -0400 |
---|---|---|
committer | Santosh Shilimkar <santosh.shilimkar@ti.com> | 2014-08-15 11:43:49 -0400 |
commit | 12cab40b16dd30ff91eb807a1a41f711e08938ad (patch) | |
tree | b2c4fca8e8092943ad392d4a0c252685b0473d2f | |
parent | a210d01b195cb4ccf7f8168eae3abeabd869182a (diff) | |
parent | 091ce2e289facaf9b9f3dcfd7118c84e73674650 (diff) | |
download | keystone/master.tar.gz |
Merge branch 'for_3.17/net-misc' into keystone/masterkeystone/master
-rw-r--r-- | arch/arm/boot/dts/k2-rtm-boc-board.dtsi | 44 | ||||
-rw-r--r-- | arch/arm/boot/dts/k2hk-evm.dts | 318 | ||||
-rw-r--r-- | arch/arm/boot/dts/keystone.dtsi | 1 | ||||
-rw-r--r-- | arch/arm/configs/keystone_defconfig | 145 | ||||
-rw-r--r-- | drivers/gpio/gpio-pca953x.c | 3 | ||||
-rw-r--r-- | drivers/net/phy/Makefile | 2 | ||||
-rw-r--r-- | drivers/net/phy/mv88x2242.c | 330 |
7 files changed, 777 insertions, 66 deletions
diff --git a/arch/arm/boot/dts/k2-rtm-boc-board.dtsi b/arch/arm/boot/dts/k2-rtm-boc-board.dtsi new file mode 100644 index 00000000000000..3144c7b57cce22 --- /dev/null +++ b/arch/arm/boot/dts/k2-rtm-boc-board.dtsi @@ -0,0 +1,44 @@ +/* + * Copyright 2014 Texas Instruments, Inc. + * + * Keystone 2 RTM BOC expansion board + * + * 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 by the Free Software Foundation. + */ + +/ { + mdiox_gpio: mdiox-gpio { + compatible = "virtual,mdio-gpio"; + #address-cells = <1>; + #size-cells = <0>; + gpios = <&gpio0 2 0x2 /* mdc */ + &gpio0 0 0x2>; /* mdio */ + + phyx0: phyx@0 { + compatible = "Marvell,88x2242", "ethernet-phy-ieee802.3-c45"; + reg = <0>; + reset-gpios = <&pca9555 8 GPIO_ACTIVE_HIGH>, + <&pca9555 9 GPIO_ACTIVE_HIGH>, + <&pca9555 10 GPIO_ACTIVE_HIGH>; + }; + + phyx1: phyx@1 { + compatible = "Marvell,88x2242", "ethernet-phy-ieee802.3-c45"; + reg = <1>; + reset-gpios = <&pca9555 8 GPIO_ACTIVE_HIGH>, + <&pca9555 9 GPIO_ACTIVE_HIGH>, + <&pca9555 10 GPIO_ACTIVE_HIGH>; + }; + }; +}; + +&i2c2 { + pca9555: pca@20 { + compatible = "nxp,pca9555"; + gpio-controller; + #gpio-cells = <2>; + reg = <0x20>; + }; +}; diff --git a/arch/arm/boot/dts/k2hk-evm.dts b/arch/arm/boot/dts/k2hk-evm.dts index 1f90cbf27fd7f7..47ad18572b08f4 100644 --- a/arch/arm/boot/dts/k2hk-evm.dts +++ b/arch/arm/boot/dts/k2hk-evm.dts @@ -11,11 +11,16 @@ #include "keystone.dtsi" #include "k2hk.dtsi" +#include "k2-rtm-boc-board.dtsi" / { compatible = "ti,k2hk-evm","ti,keystone"; model = "Texas Instruments Keystone 2 Kepler/Hawking EVM"; + aliases { + serial0 = &uart0; + }; + soc { clocks { refclksys: refclksys { @@ -53,6 +58,319 @@ clock-output-names = "refclk-ddr3b"; }; }; + qmss: qmss@2a40000 { + compatible = "ti,keystone-navigator-qmss"; + dma-coherent; + #address-cells = <1>; + #size-cells = <1>; + clocks = <&chipclk13>; + ranges; + queue-range = <0 0x4000>; + linkram0 = <0x100000 0x8000>; + linkram1 = <0x0 0x10000>; + + qmgrs { + #address-cells = <1>; + #size-cells = <1>; + ranges; + qmgr0 { + managed-queues = <0 0x2000>; + reg = <0x2a40000 0x20000>, + <0x2a06000 0x400>, + <0x2a02000 0x1000>, + <0x2a03000 0x1000>, + <0x23a80000 0x20000>, + <0x2a80000 0x20000>; + reg-names = "peek", "status", "config", + "region", "push", "pop"; + }; + + qmgr1 { + managed-queues = <0x2000 0x2000>; + reg = <0x2a60000 0x20000>, + <0x2a06400 0x400>, + <0x2a04000 0x1000>, + <0x2a05000 0x1000>, + <0x23aa0000 0x20000>, + <0x2aa0000 0x20000>; + reg-names = "peek", "status", "config", + "region", "push", "pop"; + }; + }; + queue-pools { + qpend { + qpend-0 { + qrange = <658 8>; + interrupts =<0 40 0xf04 0 41 0xf04 0 42 0xf04 + 0 43 0xf04 0 44 0xf04 0 45 0xf04 + 0 46 0xf04 0 47 0xf04>; + }; + qpend-1 { + qrange = <8704 16>; + interrupts = <0 48 0xf04 0 49 0xf04 0 50 0xf04 + 0 51 0xf04 0 52 0xf04 0 53 0xf04 + 0 54 0xf04 0 55 0xf04 0 56 0xf04 + 0 57 0xf04 0 58 0xf04 0 59 0xf04 + 0 60 0xf04 0 61 0xf04 0 62 0xf04 + 0 63 0xf04>; + qalloc-by-id; + }; + qpend-2 { + qrange = <8720 16>; + interrupts = <0 64 0xf04 0 65 0xf04 0 66 0xf04 + 0 59 0xf04 0 68 0xf04 0 69 0xf04 + 0 70 0xf04 0 71 0xf04 0 72 0xf04 + 0 73 0xf04 0 74 0xf04 0 75 0xf04 + 0 76 0xf04 0 77 0xf04 0 78 0xf04 + 0 79 0xf04>; + }; + }; + general-purpose { + gp-0 { + qrange = <4000 64>; + }; + netcp-tx { + qrange = <640 9>; + qalloc-by-id; + }; + netcpx-tx { + qrange = <8752 8>; + qalloc-by-id; + }; + }; + accumulator { + acc-0 { + qrange = <128 32>; + accumulator = <0 36 16 2 50>; + interrupts = <0 215 0xf01>; + multi-queue; + qalloc-by-id; + }; + acc-1 { + qrange = <160 32>; + accumulator = <0 37 16 2 50>; + interrupts = <0 216 0xf01>; + multi-queue; + }; + acc-2 { + qrange = <192 32>; + accumulator = <0 38 16 2 50>; + interrupts = <0 217 0xf01>; + multi-queue; + }; + acc-3 { + qrange = <224 32>; + accumulator = <0 39 16 2 50>; + interrupts = <0 218 0xf01>; + multi-queue; + }; + }; + }; + descriptor-regions { + #address-cells = <1>; + #size-cells = <1>; + ranges; + region-12 { + id = <12>; + region-spec = <8192 128>; /* num_desc desc_size */ + link-index = <0x4000>; + }; + }; + pdsps { + #address-cells = <1>; + #size-cells = <1>; + ranges; + pdsp0@0x2a10000 { + firmware = "keystone/qmss_pdsp_acc48_k2_le_1_0_0_8.fw"; + reg = <0x2a10000 0x1000>, + <0x2a0f000 0x100>, + <0x2a0c000 0x3c8>, + <0x2a20000 0x4000>; + reg-names = "iram", "reg", "intd", "cmd"; + id = <0>; + }; + }; + }; /* qmss */ + + knav_dmas: knav_dmas@0 { + compatible = "ti,keystone-navigator-dma"; + clocks = <&papllclk>, <&clkxge>; + #address-cells = <1>; + #size-cells = <1>; + ranges; + ti,navigator-cloud-address = <0x23a80000 0x23a90000 + 0x23aa0000 0x23ab0000>; + + dma_gbe: dma_gbe@0 { + reg = <0x2004000 0x100>, + <0x2004400 0x120>, + <0x2004800 0x300>, + <0x2004c00 0x120>, + <0x2005000 0x400>; + reg-names = "global", "txchan", "rxchan", + "txsched", "rxflow"; + }; + + dma_xgbe: dma_xgbe@0 { + reg = <0x2fa1000 0x100>, + <0x2fa1400 0x200>, + <0x2fa1800 0x200>, + <0x2fa1c00 0x200>, + <0x2fa2000 0x400>; + reg-names = "global", "txchan", "rxchan", + "txsched", "rxflow"; + }; + }; + + netcp: netcp@2090000 { + reg = <0x2620110 0x8>; + reg-names = "efuse"; + compatible = "ti,netcp-1.0"; + #address-cells = <1>; + #size-cells = <1>; + ranges; + + clocks = <&papllclk>, <&clkcpgmac>, <&chipclk12>; + dma-coherent; + /* big-endian; */ + + ti,navigator-dmas = <&dma_gbe 22>, + <&dma_gbe 23>, + <&dma_gbe 8>; + ti,navigator-dma-names = "netrx0", "netrx1", "nettx"; + + netcp-devices { + #address-cells = <1>; + #size-cells = <1>; + ranges; + gbe@0x2090000 { + label = "netcp-gbe"; + reg = <0x2090000 0xf00>; + /* enable-ale; */ + tx-queue = <648>; + tx-channel = "nettx"; + + interfaces { + gbe0: interface-0 { + slave-port = <0>; + link-interface = <4>; + }; + gbe1: interface-1 { + slave-port = <1>; + link-interface = <4>; + }; + }; + + secondary-slave-ports { + port-2 { + slave-port = <2>; + link-interface = <2>; + }; + port-3 { + slave-port = <3>; + link-interface = <2>; + }; + }; + }; + }; + + netcp-interfaces { + interface-0 { + rx-channel = "netrx0"; + rx-pool = <1024 12>; + tx-pool = <1024 12>; + rx-queue-depth = <128 128 0 0>; + rx-buffer-size = <1518 4096 0 0>; + rx-queue = <8704>; + tx-completion-queue = <8706>; + efuse-mac = <1>; + netcp-gbe = <&gbe0>; + + }; + interface-1 { + rx-channel = "netrx1"; + rx-pool = <1024 12>; + tx-pool = <1024 12>; + rx-queue-depth = <128 128 0 0>; + rx-buffer-size = <1518 4096 0 0>; + rx-queue = <8705>; + tx-completion-queue = <8707>; + efuse-mac = <0>; + local-mac-address = [02 18 31 7e 3e 6f]; + netcp-gbe = <&gbe1>; + }; + }; + }; + + netcpx: netcpx@2f00000 { + compatible = "ti,netcp-1.0"; + #address-cells = <1>; + #size-cells = <1>; + ranges; + + clocks = <&clkxge>; + clock-names = "clk_xge"; + dma-coherent; + /* big-endian; */ + + ti,navigator-dmas = <&dma_xgbe 0>, + <&dma_xgbe 8>, + <&dma_xgbe 0>; + ti,navigator-dma-names = "xnetrx0", "xnetrx1", "xnettx"; + + netcp-devices { + #address-cells = <1>; + #size-cells = <1>; + ranges; + xgbe@0x2f00000 { + label = "netcp-xgbe"; + reg = <0x2f00000 0xa0600>, + <0x0231e000 0x2000>; + /* enable-ale; */ + tx-queue = <8752>; + tx-channel = "xnettx"; + + interfaces { + xgbe0: interface-0 { + slave-port = <0>; + link-interface = <10>; + phy-handle = <&phyx0>; + }; + xgbe1: interface-1 { + slave-port = <1>; + link-interface = <10>; + phy-handle = <&phyx1>; + }; + }; + }; + }; + + netcp-interfaces { + interface-0 { + rx-channel = "xnetrx0"; + rx-pool = <1024 12>; /* num_desc region-id */ + tx-pool = <1024 12>; /* num_desc region-id */ + rx-queue-depth = <960 64 0 0>; + rx-buffer-size = <1518 4096 0 0>; + rx-queue = <8708>; + tx-completion-queue = <8710>; + efuse-mac = <0>; + netcp-xgbe = <&xgbe0>; + + }; + interface-1 { + rx-channel = "xnetrx1"; + rx-pool = <1024 12>; /* num_desc region-id */ + tx-pool = <1024 12>; /* num_desc region-id */ + rx-queue-depth = <960 64 0 0>; + rx-buffer-size = <1518 4096 0 0>; + rx-queue = <8709>; + tx-completion-queue = <8711>; + efuse-mac = <0>; + netcp-xgbe = <&xgbe1>; + }; + }; + }; }; leds { diff --git a/arch/arm/boot/dts/keystone.dtsi b/arch/arm/boot/dts/keystone.dtsi index c1414cb81fd4ac..75a6f9c37e8028 100644 --- a/arch/arm/boot/dts/keystone.dtsi +++ b/arch/arm/boot/dts/keystone.dtsi @@ -266,5 +266,6 @@ ranges = <0 0 0x30000000 0x10000000 1 0 0x21000A00 0x00000100>; }; + }; }; diff --git a/arch/arm/configs/keystone_defconfig b/arch/arm/configs/keystone_defconfig index 067a8f82194d5d..dc6aac0ef4f82b 100644 --- a/arch/arm/configs/keystone_defconfig +++ b/arch/arm/configs/keystone_defconfig @@ -10,9 +10,10 @@ CONFIG_KALLSYMS_ALL=y # CONFIG_ELF_CORE is not set # CONFIG_BASE_FULL is not set CONFIG_EMBEDDED=y -CONFIG_PROFILING=y -CONFIG_OPROFILE=y -CONFIG_KPROBES=y +CONFIG_PERF_EVENTS=y +# CONFIG_SLUB_DEBUG is not set +# CONFIG_COMPAT_BRK is not set +CONFIG_JUMP_LABEL=y CONFIG_MODULES=y CONFIG_MODULE_FORCE_LOAD=y CONFIG_MODULE_UNLOAD=y @@ -25,6 +26,7 @@ CONFIG_SMP=y CONFIG_PREEMPT=y CONFIG_AEABI=y CONFIG_HIGHMEM=y +CONFIG_CMA=y CONFIG_VFP=y CONFIG_NEON=y # CONFIG_SUSPEND is not set @@ -47,64 +49,63 @@ CONFIG_IP_ROUTE_VERBOSE=y CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y -CONFIG_NET_IPIP=y -CONFIG_NET_IPGRE_DEMUX=y -CONFIG_NET_IPGRE=y +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE_DEMUX=m +CONFIG_NET_IPGRE=m CONFIG_IP_MROUTE=y CONFIG_IP_MROUTE_MULTIPLE_TABLES=y CONFIG_IP_PIMSM_V2=y -CONFIG_INET_AH=y -CONFIG_INET_IPCOMP=y -CONFIG_IPV6=y -CONFIG_INET6_XFRM_MODE_TRANSPORT=m -CONFIG_INET6_XFRM_MODE_TUNNEL=m -CONFIG_INET6_XFRM_MODE_BEET=m -CONFIG_IPV6_SIT=m +CONFIG_INET_AH=m +CONFIG_INET_IPCOMP=m +CONFIG_INET_XFRM_MODE_TRANSPORT=m +CONFIG_INET_XFRM_MODE_TUNNEL=m +CONFIG_INET_XFRM_MODE_BEET=m +CONFIG_INET_LRO=m +CONFIG_INET_DIAG=m CONFIG_IPV6_MULTIPLE_TABLES=y CONFIG_IPV6_SUBTREES=y CONFIG_IPV6_MROUTE=y CONFIG_IPV6_PIMSM_V2=y CONFIG_NETFILTER=y -CONFIG_NF_CONNTRACK=y -CONFIG_NF_CT_NETLINK=y -CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y -CONFIG_NETFILTER_XT_TARGET_CONNMARK=y -CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y -CONFIG_NETFILTER_XT_TARGET_MARK=y -CONFIG_NETFILTER_XT_MATCH_COMMENT=y -CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y -CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y -CONFIG_NETFILTER_XT_MATCH_CONNMARK=y -CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y -CONFIG_NETFILTER_XT_MATCH_CPU=y -CONFIG_NETFILTER_XT_MATCH_IPRANGE=y -CONFIG_NETFILTER_XT_MATCH_LENGTH=y -CONFIG_NETFILTER_XT_MATCH_MAC=y -CONFIG_NETFILTER_XT_MATCH_MARK=y -CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y -CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y -CONFIG_NETFILTER_XT_MATCH_STATE=y -CONFIG_NF_CONNTRACK_IPV4=y -CONFIG_IP_NF_IPTABLES=y -CONFIG_IP_NF_MATCH_AH=y -CONFIG_IP_NF_MATCH_ECN=y -CONFIG_IP_NF_MATCH_TTL=y -CONFIG_IP_NF_FILTER=y -CONFIG_IP_NF_TARGET_REJECT=y -CONFIG_IP_NF_TARGET_ULOG=y -CONFIG_IP_NF_MANGLE=y -CONFIG_IP_NF_TARGET_CLUSTERIP=y -CONFIG_IP_NF_TARGET_ECN=y -CONFIG_IP_NF_TARGET_TTL=y -CONFIG_IP_NF_RAW=y -CONFIG_IP_NF_ARPTABLES=y -CONFIG_IP_NF_ARPFILTER=y -CONFIG_IP_NF_ARP_MANGLE=y +CONFIG_NF_CONNTRACK=m +# CONFIG_NF_CONNTRACK_PROCFS is not set +CONFIG_NF_CT_NETLINK=m +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m +CONFIG_NETFILTER_XT_TARGET_CONNMARK=m +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m +CONFIG_NETFILTER_XT_TARGET_MARK=m +CONFIG_NETFILTER_XT_MATCH_COMMENT=m +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m +CONFIG_NETFILTER_XT_MATCH_CONNMARK=m +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_CPU=m +CONFIG_NETFILTER_XT_MATCH_IPRANGE=m +CONFIG_NETFILTER_XT_MATCH_LENGTH=m +CONFIG_NETFILTER_XT_MATCH_MAC=m +CONFIG_NETFILTER_XT_MATCH_MARK=m +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m +CONFIG_NETFILTER_XT_MATCH_STATE=m +CONFIG_NF_CONNTRACK_IPV4=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_AH=m +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_ULOG=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_CLUSTERIP=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_TTL=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m CONFIG_IP6_NF_IPTABLES=m -CONFIG_IP_SCTP=y -CONFIG_VLAN_8021Q=y +CONFIG_IP_SCTP=m CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" -CONFIG_CMA=y CONFIG_DMA_CMA=y CONFIG_MTD=y CONFIG_MTD_CMDLINE_PARTS=y @@ -115,12 +116,16 @@ CONFIG_MTD_NAND=y CONFIG_MTD_NAND_DAVINCI=y CONFIG_MTD_SPI_NOR=y CONFIG_MTD_UBI=y -CONFIG_PROC_DEVICETREE=y CONFIG_BLK_DEV_LOOP=y CONFIG_EEPROM_AT24=y CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y CONFIG_NETDEVICES=y +CONFIG_TI_KEYSTONE_NETCP=y +CONFIG_PHYLIB=y +CONFIG_MARVELL_PHY=y +CONFIG_MDIO_BITBANG=y +CONFIG_MDIO_GPIO=y CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_OF_PLATFORM=y @@ -132,12 +137,15 @@ CONFIG_I2C_DAVINCI=y CONFIG_SPI=y CONFIG_SPI_DAVINCI=y CONFIG_SPI_SPIDEV=y +CONFIG_GPIOLIB=y +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_DAVINCI=y +CONFIG_GPIO_PCA953X=y # CONFIG_HWMON is not set CONFIG_POWER_SUPPLY=y CONFIG_POWER_RESET=y CONFIG_POWER_RESET_KEYSTONE=y CONFIG_WATCHDOG=y -CONFIG_WATCHDOG_CORE=y CONFIG_DAVINCI_WATCHDOG=y CONFIG_USB=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y @@ -148,8 +156,19 @@ CONFIG_USB_DWC3=y CONFIG_USB_DWC3_DEBUG=y CONFIG_USB_DWC3_VERBOSE=y CONFIG_KEYSTONE_USB_PHY=y +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y +CONFIG_LEDS_GPIO=y +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_ONESHOT=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +CONFIG_LEDS_TRIGGER_BACKLIGHT=y +CONFIG_LEDS_TRIGGER_GPIO=y CONFIG_DMADEVICES=y CONFIG_TI_EDMA=y +CONFIG_SOC_TI=y +CONFIG_KEYSTONE_NAVIGATOR_QMSS=y +CONFIG_KEYSTONE_NAVIGATOR_DMA=y CONFIG_MEMORY=y CONFIG_TI_AEMIF=y CONFIG_EXT4_FS=y @@ -171,27 +190,23 @@ CONFIG_NFSD_V3_ACL=y CONFIG_NLS_CODEPAGE_437=y CONFIG_NLS_ISO8859_1=y CONFIG_PRINTK_TIME=y -CONFIG_DEBUG_SHIRQ=y CONFIG_DEBUG_INFO=y +CONFIG_DEBUG_FS=y +# CONFIG_SCHED_DEBUG is not set +# CONFIG_DEBUG_PREEMPT is not set +# CONFIG_FTRACE is not set CONFIG_DEBUG_USER=y CONFIG_CRYPTO_USER=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_AUTHENC=y CONFIG_CRYPTO_CBC=y CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_XCBC=y +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_DES=y CONFIG_CRYPTO_ANSI_CPRNG=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y -CONFIG_GPIOLIB=y -CONFIG_GPIO_SYSFS=y -CONFIG_GPIO_DAVINCI=y -CONFIG_LEDS_CLASS=y -CONFIG_NEW_LEDS=y -CONFIG_LEDS_GPIO=y -CONFIG_LEDS_TRIGGERS=y -CONFIG_LEDS_TRIGGER_ONESHOT=y -CONFIG_LEDS_TRIGGER_HEARTBEAT=y -CONFIG_LEDS_TRIGGER_BACKLIGHT=y -CONFIG_LEDS_TRIGGER_GPIO=y +CONFIG_LIBCRC32C=y diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c index e721a37c3473ef..15922a236c9db6 100644 --- a/drivers/gpio/gpio-pca953x.c +++ b/drivers/gpio/gpio-pca953x.c @@ -358,6 +358,9 @@ static void pca953x_setup_gpio(struct pca953x_chip *chip, int gpios) gc->dev = &chip->client->dev; gc->owner = THIS_MODULE; gc->names = chip->names; +#ifdef CONFIG_OF_GPIO + gc->of_node = gc->dev->of_node; +#endif } #ifdef CONFIG_GPIO_PCA953X_IRQ diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile index 7dc3d5b304cfc2..9ee3e72305fa69 100644 --- a/drivers/net/phy/Makefile +++ b/drivers/net/phy/Makefile @@ -3,7 +3,7 @@ libphy-objs := phy.o phy_device.o mdio_bus.o obj-$(CONFIG_PHYLIB) += libphy.o -obj-$(CONFIG_MARVELL_PHY) += marvell.o +obj-$(CONFIG_MARVELL_PHY) += marvell.o mv88x2242.o obj-$(CONFIG_DAVICOM_PHY) += davicom.o obj-$(CONFIG_CICADA_PHY) += cicada.o obj-$(CONFIG_LXT_PHY) += lxt.o diff --git a/drivers/net/phy/mv88x2242.c b/drivers/net/phy/mv88x2242.c new file mode 100644 index 00000000000000..7bbde8ff715c37 --- /dev/null +++ b/drivers/net/phy/mv88x2242.c @@ -0,0 +1,330 @@ +/* Driver for Marvell PHY 88X2242 + * + * Partially based on drivers/net/phy/bcm87xx.c + * + * Copyright (C) 2013 Texas Instruments Incorporated + * Authors: WingMan Kwok <w-kwok2@ti.com> + * + * 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 version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <linux/module.h> +#include <linux/delay.h> +#include <linux/phy.h> +#include <linux/of.h> +#include <linux/gpio.h> +#include <linux/gpio/consumer.h> + +#define MARVELL_PHY_ID_88X2242 0x01410f12 +#define MARVELL_PHY_ID_MASK 0xfffffc00 + +/* chip level regs */ +#define MV88X2242_TX_SRC_N (MII_ADDR_C45 | 0x1ff400) +#define MV88X2242_TX_SRC_M (MII_ADDR_C45 | 0x1ff401) +#define MV88X2242_HOST_LANE_MUX (MII_ADDR_C45 | 0x1ff402) +#define MV88X2242_HW_RESET (MII_ADDR_C45 | 0x1ff404) + +/* port level regs */ +#define MV88X2242_PCS_CONFIG (MII_ADDR_C45 | 0x1ff002) +#define MV88X2242_PORT_RESET (MII_ADDR_C45 | 0x1ff003) +#define MV88X2242_GPIO_TRI_CTRL (MII_ADDR_C45 | 0x1ff013) +#define MV88X2242_GPIO_INTR_TYPE3 (MII_ADDR_C45 | 0x1ff016) + +/* SFI PMA regs */ +#define MV88X2242_PMD_RX_SIGNAL_DETECT (MII_ADDR_C45 | 0x01000a) + +/* SFI 10BASE-R PCS regs */ +#define MV88X2242_10GBASER_PCS_CTRL (MII_ADDR_C45 | 0x030000) +#define MV88X2242_10GBASER_PCS_STATUS (MII_ADDR_C45 | 0x030020) +#define MV88X2242_LASI_CONTROL (MII_ADDR_C45 | 0x038000) +#define MV88X2242_LASI_STATUS (MII_ADDR_C45 | 0x038001) + +/* XFI 10BASE-R PCS regs */ +#define MV88X2242_BASER_PCS_STATUS (MII_ADDR_C45 | 0x040020) + +static int mv88x2242_chip_init_done; + + +/* Perform one time chip level initialization. + */ +static int mv88x2242_chip_level_config(struct phy_device *phydev) +{ + int val; + + /* chip hw reset */ + phy_write(phydev, MV88X2242_HW_RESET, 0x4000); + + mdelay(10); + + /* Map ports */ + /* Added by TI for port mapping 0123:0123, + * The default is M0-to-N0, M2-to-N1, + * so setting bit 9 makes M1-to-N1 instead. + * Must be done prior to the reset! + * BEGR: I believe only one write is required for this, + * as 31.F4xx registers are accessible through any of the + * 4 PHY addresses. + */ + phy_write(phydev, MV88X2242_HOST_LANE_MUX, BIT(9)); + + /* Shut down unused lanes */ + val = phy_read(phydev, MV88X2242_TX_SRC_N); + val &= 0x00ff; + phy_write(phydev, MV88X2242_TX_SRC_N, val); + + val = phy_read(phydev, MV88X2242_TX_SRC_M); + val &= 0x00ff; + phy_write(phydev, MV88X2242_TX_SRC_M, val); + + return 0; +} + +/* Perform one time port level initialization. + */ +static int mv88x2242_port_level_config(struct phy_device *phydev) +{ + int val; + + if (phydev->priv) { + dev_info(&phydev->dev, "phy %d already configured\n", + phydev->addr); + return 0; + } + + /*10gx2, 6G */ + phy_write(phydev, MV88X2242_PCS_CONFIG, 0x7171); + + /* pcs reset */ + phy_write(phydev, MV88X2242_PORT_RESET, 0x8080); + + mdelay(10); + + /* Required to Enable Optical module transmitter */ + /* For Fiber Tx Disable to enable optics (REQUIRED) */ + val = phy_read(phydev, MV88X2242_GPIO_INTR_TYPE3); + val = (val & ~0x0018) | 0x0010; + phy_write(phydev, MV88X2242_GPIO_INTR_TYPE3, val); + + /* Enable Marvell I2C SCL/SDA operations */ + val = phy_read(phydev, MV88X2242_GPIO_INTR_TYPE3); + val = (val & ~0x0800) | 0x0800; + phy_write(phydev, MV88X2242_GPIO_INTR_TYPE3, val); + + val = phy_read(phydev, MV88X2242_GPIO_INTR_TYPE3); + val = (val & ~0x8000) | 0x8000; + phy_write(phydev, MV88X2242_GPIO_INTR_TYPE3, val); + + val = phy_read(phydev, MV88X2242_GPIO_TRI_CTRL); + val = (val & ~0x0800) | 0x0800; + phy_write(phydev, MV88X2242_GPIO_TRI_CTRL, val); + + mdelay(10); + + phydev->priv = (void *)1; + + /* Read Each Lane Optical traceiver name? */ + + return 0; +} + +/* Reset chip + */ +static int mv88x2242_chip_reset(struct phy_device *phydev) +{ + int ret; + struct gpio_desc *gpio_reset0; + struct gpio_desc *gpio_reset1; + struct gpio_desc *gpio_reset2; + int msec = 1; + struct device *dev = &phydev->dev; + + gpio_reset0 = gpiod_get_index(dev, "reset", 0); + if (IS_ERR(gpio_reset0)) + return PTR_ERR(gpio_reset0); + + gpio_reset1 = gpiod_get_index(dev, "reset", 1); + if (IS_ERR(gpio_reset1)) { + gpiod_put(gpio_reset0); + return PTR_ERR(gpio_reset1); + } + + gpio_reset2 = gpiod_get_index(dev, "reset", 2); + if (IS_ERR(gpio_reset2)) { + gpiod_put(gpio_reset0); + gpiod_put(gpio_reset1); + return PTR_ERR(gpio_reset2); + } + + ret = gpiod_direction_output(gpio_reset0, 0); + ret |= gpiod_direction_output(gpio_reset1, 0); + ret |= gpiod_direction_output(gpio_reset2, 0); + if (ret) + goto err; + + msleep(msec); + + gpiod_set_value_cansleep(gpio_reset0, 1); + gpiod_set_value_cansleep(gpio_reset1, 1); + gpiod_set_value_cansleep(gpio_reset2, 1); + +err: + gpiod_put(gpio_reset0); + gpiod_put(gpio_reset1); + gpiod_put(gpio_reset2); + return ret; +} + +static int mv88x2242_config_init(struct phy_device *phydev) +{ + if (!mv88x2242_chip_init_done) { + int ret; + /* chip level config */ + ret = mv88x2242_chip_reset(phydev); + if (ret) + return ret; + mv88x2242_chip_level_config(phydev); + mv88x2242_chip_init_done = 1; + } + + /* port level config */ + mv88x2242_port_level_config(phydev); + + phydev->supported = SUPPORTED_10000baseR_FEC; + phydev->advertising = ADVERTISED_10000baseR_FEC; + phydev->state = PHY_NOLINK; + phydev->autoneg = AUTONEG_DISABLE; + + return 0; +} + +static int mv88x2242_config_aneg(struct phy_device *phydev) +{ + return -EINVAL; +} + +static int mv88x2242_read_status(struct phy_device *phydev) +{ + int rx_signal_detect; + int pcs_status; + + rx_signal_detect = phy_read(phydev, MV88X2242_PMD_RX_SIGNAL_DETECT); + if (rx_signal_detect < 0) + return rx_signal_detect; + + if ((rx_signal_detect & BIT(0)) == 0) + goto no_link; + + pcs_status = phy_read(phydev, MV88X2242_10GBASER_PCS_STATUS); + if (pcs_status < 0) + return pcs_status; + + if ((pcs_status & BIT(0)) == 0) + goto no_link; + + pcs_status = phy_read(phydev, MV88X2242_BASER_PCS_STATUS); + if (pcs_status < 0) + return pcs_status; + + if ((pcs_status & BIT(12)) == 0) { + dev_warn(&phydev->dev, + "WARN: host side receive link down\n"); + goto no_link; + } + + phydev->speed = SPEED_10000; + phydev->link = 1; + phydev->duplex = DUPLEX_FULL; + return 0; + +no_link: + phydev->link = 0; + return 0; +} + +static int mv88x2242_config_intr(struct phy_device *phydev) +{ + int reg, err; + + reg = phy_read(phydev, MV88X2242_LASI_CONTROL); + + if (reg < 0) + return reg; + + if (phydev->interrupts == PHY_INTERRUPT_ENABLED) + reg |= 1; + else + reg &= ~1; + + err = phy_write(phydev, MV88X2242_LASI_CONTROL, reg); + return err; +} + +static int mv88x2242_did_interrupt(struct phy_device *phydev) +{ + int reg; + + reg = phy_read(phydev, MV88X2242_LASI_STATUS); + + if (reg < 0) { + dev_err(&phydev->dev, + "Error: Read of MV88X2242_LASI_STATUS failed: %d\n", + reg); + return 0; + } + return (reg & 1) != 0; +} + +static int mv88x2242_ack_interrupt(struct phy_device *phydev) +{ + /* Reading the LASI status clears it. */ + mv88x2242_did_interrupt(phydev); + return 0; +} + +static int mv88x2242_match_phy_device(struct phy_device *phydev) +{ + return (phydev->c45_ids.device_ids[4] & MARVELL_PHY_ID_MASK) == + (MARVELL_PHY_ID_88X2242 & MARVELL_PHY_ID_MASK); +} + +static struct phy_driver mv88x2242_driver[] = { +{ + .phy_id = MARVELL_PHY_ID_88X2242, + .phy_id_mask = MARVELL_PHY_ID_MASK, + .name = "Marvell 88x2242", + .flags = PHY_HAS_INTERRUPT, + .config_init = mv88x2242_config_init, + .config_aneg = mv88x2242_config_aneg, + .read_status = mv88x2242_read_status, + .ack_interrupt = mv88x2242_ack_interrupt, + .config_intr = mv88x2242_config_intr, + .did_interrupt = mv88x2242_did_interrupt, + .match_phy_device = mv88x2242_match_phy_device, + .driver = { .owner = THIS_MODULE }, +} +}; + +static int __init mv88x2242_init(void) +{ + return phy_drivers_register(mv88x2242_driver, + ARRAY_SIZE(mv88x2242_driver)); +} +module_init(mv88x2242_init); + +static void __exit mv88x2242_exit(void) +{ + phy_drivers_unregister(mv88x2242_driver, + ARRAY_SIZE(mv88x2242_driver)); +} +module_exit(mv88x2242_exit); + +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("WingMan Kwok <w-kwok2@ti.com>"); +MODULE_DESCRIPTION("Driver For Marvell PHY 88X2242"); |