diff options
-rw-r--r-- | Documentation/devicetree/bindings/net/can/fsl-flexcan.txt | 4 | ||||
-rw-r--r-- | arch/arm/boot/dts/ls1021a-qds.dts | 8 | ||||
-rwxr-xr-x | arch/arm/boot/dts/ls1021a-twr.dts | 122 | ||||
-rw-r--r-- | arch/arm/boot/dts/ls1021a.dtsi | 102 | ||||
-rw-r--r-- | arch/arm/configs/ls1021a_defconfig | 1 | ||||
-rw-r--r-- | arch/arm/mach-imx/mach-ls1021a.c | 23 | ||||
-rw-r--r-- | arch/arm/mach-imx/pm-ls1.c | 118 | ||||
-rw-r--r-- | arch/arm/mach-imx/sleep-ls1.S | 23 | ||||
-rw-r--r-- | drivers/crypto/caam/ctrl.c | 31 | ||||
-rw-r--r-- | drivers/mmc/host/sdhci-pltfm.c | 3 | ||||
-rw-r--r-- | drivers/mmc/host/sdhci.c | 94 | ||||
-rw-r--r-- | drivers/net/can/Kconfig | 12 | ||||
-rw-r--r-- | drivers/net/can/flexcan.c | 335 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/gianfar.h | 9 | ||||
-rw-r--r-- | drivers/net/wan/fsl_ucc_hdlc.c | 239 | ||||
-rw-r--r-- | drivers/pci/host/pci-layerscape.c | 80 | ||||
-rw-r--r-- | include/linux/mmc/sdhci.h | 3 | ||||
-rw-r--r-- | include/sound/pcm.h | 2 | ||||
-rw-r--r-- | sound/core/pcm_lib.c | 38 | ||||
-rw-r--r-- | sound/soc/fsl/fsl_sai.c | 13 |
20 files changed, 672 insertions, 588 deletions
diff --git a/Documentation/devicetree/bindings/net/can/fsl-flexcan.txt b/Documentation/devicetree/bindings/net/can/fsl-flexcan.txt index 56d6cc3..0d5e668 100644 --- a/Documentation/devicetree/bindings/net/can/fsl-flexcan.txt +++ b/Documentation/devicetree/bindings/net/can/fsl-flexcan.txt @@ -18,6 +18,10 @@ Optional properties: - xceiver-supply: Regulator that powers the CAN transceiver +- little-endian: If the FlexCAN IP on this SoC is little-endian, use + this property. By default it is assumed that the IP + is big-endian + Example: can@1c000 { diff --git a/arch/arm/boot/dts/ls1021a-qds.dts b/arch/arm/boot/dts/ls1021a-qds.dts index 93cda05..c029e65 100644 --- a/arch/arm/boot/dts/ls1021a-qds.dts +++ b/arch/arm/boot/dts/ls1021a-qds.dts @@ -436,6 +436,14 @@ status = "okay"; }; +&can2 { + status = "disabled"; +}; + +&can3 { + status = "disabled"; +}; + &sai2 { status = "okay"; }; diff --git a/arch/arm/boot/dts/ls1021a-twr.dts b/arch/arm/boot/dts/ls1021a-twr.dts index 6486178..db1c6b6 100755 --- a/arch/arm/boot/dts/ls1021a-twr.dts +++ b/arch/arm/boot/dts/ls1021a-twr.dts @@ -1,5 +1,5 @@ /* - * Copyright 2013-2014 Freescale Semiconductor, Inc. + * Copyright 2013-2015 Freescale Semiconductor, Inc. * * 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 @@ -58,6 +58,22 @@ }; }; +&can0 { + status = "okay"; +}; + +&can1 { + status = "okay"; +}; + +&can2 { + status = "disabled"; +}; + +&can3 { + status = "disabled"; +}; + &dcu0 { display = <&display>; status = "okay"; @@ -112,8 +128,24 @@ status = "okay"; }; +&ftm0 { + status = "okay"; +}; + &i2c0 { status = "okay"; + + ina220@40 { + compatible = "ti,ina220"; + reg = <0x40>; + shunt-resistor = <1000>; + }; + + ina220@41 { + compatible = "ti,ina220"; + reg = <0x41>; + shunt-resistor = <1000>; + }; }; &i2c1 { @@ -157,52 +189,69 @@ device-width = <1>; partition@0 { - /* 128KB for rcw */ - reg = <0x00000000 0x0020000>; + /* 128KB for bank0 RCW */ + reg = <0x00000000 0x00020000>; label = "NOR bank0 RCW Image"; }; - partition@20000 { - /* 1MB for DTB */ - reg = <0x00020000 0x00100000>; - label = "NOR DTB Image"; + partition@100000 { + /* 1MB for bank0 u-boot Image */ + reg = <0x00100000 0x00100000>; + label = "NOR bank0 u-boot Image"; }; - partition@120000 { - /* 8 MB for Linux Kernel Image */ - reg = <0x00120000 0x00800000>; - label = "NOR Linux Kernel Image"; + partition@200000 { + /* 1MB for bank0 DTB */ + reg = <0x00200000 0x00100000>; + label = "NOR bank0 DTB Image"; }; - partition@920000 { - /* 56MB for Ramdisk Root File System */ - reg = <0x00920000 0x03600000>; - label = "NOR Ramdisk Root File System Image"; + partition@300000 { + /* 7MB for bank0 Linux Kernel */ + reg = <0x00300000 0x00700000>; + label = "NOR bank0 Linux Kernel Image"; }; - partition@3f80000 { - /* 512KB for bank4 u-boot Image */ - reg = <0x03f80000 0x80000>; - label = "NOR bank4 u-boot Image"; + partition@a00000 { + /* 54MB for bank0 Ramdisk Root File System */ + reg = <0x00a00000 0x03600000>; + label = "NOR bank0 Ramdisk Root File System Image"; }; partition@4000000 { - /* 128KB for bank4 RCW Image */ - reg = <0x04000000 0x20000>; + /* 128KB for bank4 RCW */ + reg = <0x04000000 0x00020000>; label = "NOR bank4 RCW Image"; }; - partition@4020000 { - /* 63MB JFFS2 ROOT File System Image */ - reg = <0x04020000 0x3f00000>; - label = "NOR JFFS2 ROOT File System Image"; + partition@4100000 { + /* 1MB for bank4 u-boot Image */ + reg = <0x04100000 0x00100000>; + label = "NOR bank4 u-boot Image"; }; - partition@7f80000 { - /* 512KB for bank0 u-boot Image */ - reg = <0x07f80000 0x80000>; - label = "NOR bank0 u-boot Image"; + partition@4200000 { + /* 1MB for bank4 DTB */ + reg = <0x04200000 0x00100000>; + label = "NOR bank4 DTB Image"; + }; + + partition@4300000 { + /* 7MB for bank4 Linux Kernel */ + reg = <0x04300000 0x00700000>; + label = "NOR bank4 Linux Kernel Image"; }; + + partition@4a00000 { + /* 54MB for bank4 Ramdisk Root File System */ + reg = <0x04a00000 0x03600000>; + label = "NOR bank4 Ramdisk Root File System Image"; + }; + }; + + cpld@2,0 { + compatible = "fsl,ls1021atwr-cpld"; + reg = <0x2 0x0 0x100>; }; }; @@ -271,6 +320,21 @@ }; }; +&dspi1 { + bus-num = <0>; + status = "okay"; + + dspiflash: compatible@0 { + compatible = "st,m25p80"; + #address-cells = <1>; + #size-cells = <1>; + spi-max-frequency = <3000000>; + spi-cpol; + spi-cpha; + reg = <0>; + }; +}; + &sai1 { status = "okay"; }; diff --git a/arch/arm/boot/dts/ls1021a.dtsi b/arch/arm/boot/dts/ls1021a.dtsi index c98b794..eddd576 100644 --- a/arch/arm/boot/dts/ls1021a.dtsi +++ b/arch/arm/boot/dts/ls1021a.dtsi @@ -257,6 +257,7 @@ clocks = <&platform_clk 1>; spi-num-chipselects = <5>; big-endian; + tcfq-mode; status = "disabled"; }; @@ -555,7 +556,6 @@ dma-names = "tx", "rx"; dmas = <&edma0 1 47>, <&edma0 1 46>; - big-endian-regs; status = "disabled"; }; @@ -568,7 +568,6 @@ dma-names = "tx", "rx"; dmas = <&edma0 1 45>, <&edma0 1 44>; - big-endian-regs; status = "disabled"; }; @@ -618,22 +617,28 @@ fsl,magic-packet; fsl,wake-on-filer; sleep = <&rcpm 0x80000000 0x0>; - fsl,num_rx_queues = <0x1>; - fsl,num_tx_queues = <0x1>; + fsl,num_rx_queues = <0x8>; + fsl,num_tx_queues = <0x8>; local-mac-address = [ 00 00 00 00 00 00 ]; ranges; - queue-group@0 { - #address-cells = <1>; - #size-cells = <1>; - reg = <0x0 0x2d10000 0x0 0x8000>; - fsl,rx-bit-map = <0xff>; - fsl,tx-bit-map = <0xff>; + queue-group@2d10000 { + #address-cells = <2>; + #size-cells = <2>; + reg = <0x0 0x2d10000 0x0 0x1000>; interrupts = <GIC_SPI 144 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 145 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 146 IRQ_TYPE_LEVEL_HIGH>; }; + queue-group@2d14000 { + #address-cells = <2>; + #size-cells = <2>; + reg = <0x0 0x2d14000 0x0 0x1000>; + interrupts = <GIC_SPI 147 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 148 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 149 IRQ_TYPE_LEVEL_HIGH>; + }; }; enet1: ethernet@2d50000 { @@ -644,22 +649,28 @@ interrupt-parent = <&gic>; model = "eTSEC"; fsl,dma-endian-le; - fsl,num_rx_queues = <0x1>; - fsl,num_tx_queues = <0x1>; + fsl,num_rx_queues = <0x8>; + fsl,num_tx_queues = <0x8>; local-mac-address = [ 00 00 00 00 00 00 ]; ranges; - queue-group@0 { - #address-cells = <1>; - #size-cells = <1>; - reg = <0x0 0x2d50000 0x0 0x8000>; - fsl,rx-bit-map = <0xff>; - fsl,tx-bit-map = <0xff>; + queue-group@2d50000 { + #address-cells = <2>; + #size-cells = <2>; + reg = <0x0 0x2d50000 0x0 0x1000>; interrupts = <GIC_SPI 150 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 152 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 153 IRQ_TYPE_LEVEL_HIGH>; }; + queue-group@2d54000 { + #address-cells = <2>; + #size-cells = <2>; + reg = <0x0 0x2d54000 0x0 0x1000>; + interrupts = <GIC_SPI 154 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 155 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 156 IRQ_TYPE_LEVEL_HIGH>; + }; }; enet2: ethernet@2d90000 { @@ -670,65 +681,64 @@ interrupt-parent = <&gic>; model = "eTSEC"; fsl,dma-endian-le; - fsl,num_rx_queues = <0x1>; - fsl,num_tx_queues = <0x1>; + fsl,num_rx_queues = <0x8>; + fsl,num_tx_queues = <0x8>; local-mac-address = [ 00 00 00 00 00 00 ]; ranges; - queue-group@0 { - #address-cells = <1>; - #size-cells = <1>; - reg = <0x0 0x2d90000 0x0 0x8000>; - fsl,rx-bit-map = <0xff>; - fsl,tx-bit-map = <0xff>; + queue-group@2d90000 { + #address-cells = <2>; + #size-cells = <2>; + reg = <0x0 0x2d90000 0x0 0x1000>; interrupts = <GIC_SPI 157 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 158 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 159 IRQ_TYPE_LEVEL_HIGH>; }; + + queue-group@2d94000 { + #address-cells = <2>; + #size-cells = <2>; + reg = <0x0 0x2d94000 0x0 0x1000>; + interrupts = <GIC_SPI 160 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 161 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 162 IRQ_TYPE_LEVEL_HIGH>; + }; }; can0: can@2a70000 { - compatible = "fsl,ls1021a-flexcan"; + compatible = "fsl,ls1021ar2-flexcan"; reg = <0x0 0x2a70000 0x0 0x1000>; interrupts = <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>; - clocks = <&platform_clk 1>; - clock-frequency = <150000000>; - clock-names = "per"; + clocks = <&platform_clk 1>, <&platform_clk 1>; + clock-names = "ipg", "per"; little-endian; - status = "disabled"; }; can1: can@2a80000 { - compatible = "fsl,ls1021a-flexcan"; + compatible = "fsl,ls1021ar2-flexcan"; reg = <0x0 0x2a80000 0x0 0x1000>; interrupts = <GIC_SPI 127 IRQ_TYPE_LEVEL_HIGH>; - clocks = <&platform_clk 1>; - clock-frequency = <150000000>; - clock-names = "per"; + clocks = <&platform_clk 1>, <&platform_clk 1>; + clock-names = "ipg", "per"; little-endian; - status = "disabled"; }; can2: can@2a90000 { - compatible = "fsl,ls1021a-flexcan"; + compatible = "fsl,ls1021ar2-flexcan"; reg = <0x0 0x2a90000 0x0 0x1000>; interrupts = <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>; - clocks = <&platform_clk 1>; - clock-frequency = <150000000>; - clock-names = "per"; + clocks = <&platform_clk 1>, <&platform_clk 1>; + clock-names = "ipg", "per"; little-endian; - status = "disabled"; }; can3: can@2aa0000 { - compatible = "fsl,ls1021a-flexcan"; + compatible = "fsl,ls1021ar2-flexcan"; reg = <0x0 0x2aa0000 0x0 0x1000>; interrupts = <GIC_SPI 129 IRQ_TYPE_LEVEL_HIGH>; - clocks = <&platform_clk 1>; - clock-frequency = <150000000>; - clock-names = "per"; + clocks = <&platform_clk 1>, <&platform_clk 1>; + clock-names = "ipg", "per"; little-endian; - status = "disabled"; }; usb@8600000 { diff --git a/arch/arm/configs/ls1021a_defconfig b/arch/arm/configs/ls1021a_defconfig index 12f5f84..8721e23 100644 --- a/arch/arm/configs/ls1021a_defconfig +++ b/arch/arm/configs/ls1021a_defconfig @@ -104,6 +104,7 @@ CONFIG_SATA_SIL24=y CONFIG_NETDEVICES=y CONFIG_GIANFAR=y CONFIG_E1000E=y +CONFIG_AT803X_PHY=y CONFIG_VITESSE_PHY=y CONFIG_BROADCOM_PHY=y CONFIG_REALTEK_PHY=y diff --git a/arch/arm/mach-imx/mach-ls1021a.c b/arch/arm/mach-imx/mach-ls1021a.c index 3692dd0..dbb0256 100644 --- a/arch/arm/mach-imx/mach-ls1021a.c +++ b/arch/arm/mach-imx/mach-ls1021a.c @@ -10,13 +10,36 @@ #include <linux/clk-provider.h> #include <linux/clockchips.h> #include <linux/clocksource.h> +#include <linux/dma-mapping.h> #include <linux/of_platform.h> #include <asm/mach/arch.h> #include "common.h" +static int ls1021a_platform_notifier(struct notifier_block *nb, + unsigned long event, void *__dev) +{ + struct device *dev = __dev; + + if (event != BUS_NOTIFY_ADD_DEVICE) + return NOTIFY_DONE; + + if (of_device_is_compatible(dev->of_node, "fsl,etsec2")) + set_dma_ops(dev, &arm_coherent_dma_ops); + else if (of_property_read_bool(dev->of_node, "dma-coherent")) + set_dma_ops(dev, &arm_coherent_dma_ops); + + return NOTIFY_OK; +} + +static struct notifier_block ls1021a_platform_nb = { + .notifier_call = ls1021a_platform_notifier, +}; + static void __init ls1021a_init_machine(void) { + bus_register_notifier(&platform_bus_type, &ls1021a_platform_nb); + mxc_arch_reset_init_dt(); of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); } diff --git a/arch/arm/mach-imx/pm-ls1.c b/arch/arm/mach-imx/pm-ls1.c index b8bfdb5..d1af079 100644 --- a/arch/arm/mach-imx/pm-ls1.c +++ b/arch/arm/mach-imx/pm-ls1.c @@ -48,6 +48,8 @@ #define CCSR_SCFG_PMCINTSR 0x168 #define CCSR_SCFG_SPARECR2 0x504 #define CCSR_SCFG_SPARECR3 0x508 +#define CCSR_SCFG_CLUSTERPMCR 0x904 +#define CCSR_SCFG_CLUSTERPMCR_WFIL2EN 0x80000000 #define CCSR_DCFG_CRSTSR 0x400 #define CCSR_DCFG_CRSTSR_VAL 0x00000008 @@ -65,6 +67,9 @@ #define CCSR_RCPM_IPPDEXPCR1_LPUART 0x40000000 #define CCSR_RCPM_IPPDEXPCR1_FLEXTIMER 0x20000000 #define CCSR_RCPM_IPPDEXPCR1_OCRAM1 0x10000000 +#define CCSR_RCPM_NFIQOUTR 0x15c +#define CCSR_RCPM_NIRQOUTR 0x16c +#define CCSR_RCPM_DSIMSKR 0x18c #define QIXIS_CTL_SYS 0x5 #define QIXIS_CTL_SYS_EVTSW_MASK 0x0c @@ -101,11 +106,19 @@ static struct ls1_pm_baseaddr ls1_pm_base; static unsigned int sleep_modes; static suspend_state_t ls1_pm_state; -static void ls1_pm_iomap(void) +static int ls1_pm_iomap(int deepsleep) { struct device_node *np; void *base; + np = of_find_compatible_node(NULL, NULL, "fsl,ls1021a-scfg"); + base = of_iomap(np, 0); + BUG_ON(!base); + ls1_pm_base.scfg = base; + + if (!deepsleep) + return 0; + np = of_find_compatible_node(NULL, NULL, "fsl,ls1021a-dcsr-epu"); base = of_iomap(np, 0); BUG_ON(!base); @@ -119,41 +132,59 @@ static void ls1_pm_iomap(void) BUG_ON(!base); ls1_pm_base.dcsr_rcpm2 = base; - np = of_find_compatible_node(NULL, NULL, "fsl,ls1021a-scfg"); - base = of_iomap(np, 0); - BUG_ON(!base); - ls1_pm_base.scfg = base; - np = of_find_compatible_node(NULL, NULL, "fsl,ls1021a-dcfg"); base = of_iomap(np, 0); BUG_ON(!base); ls1_pm_base.dcfg = base; np = of_find_compatible_node(NULL, NULL, "fsl,ls1021aqds-fpga"); - base = of_iomap(np, 0); - BUG_ON(!base); - ls1_pm_base.fpga = base; + if (np) { + base = of_iomap(np, 0); + BUG_ON(!base); + ls1_pm_base.fpga = base; + } else { + np = of_find_compatible_node(NULL, NULL, + "fsl,ls1021atwr-cpld"); + if (!np) { + pr_err("%s: Can not find cpld/fpga node.\n", __func__); + return -ENODEV; + } + } base = ioremap(SRAM_CODE_BASE_PHY, PAGE_SIZE); BUG_ON(!base); ls1_pm_base.sram = base; + + return 0; } -static void ls1_pm_uniomap(void) +static void ls1_pm_uniomap(int deepsleep) { + iounmap(ls1_pm_base.scfg); + if (!deepsleep) + return; + iounmap(ls1_pm_base.epu); iounmap(ls1_pm_base.dcsr_rcpm1); iounmap(ls1_pm_base.dcsr_rcpm2); - iounmap(ls1_pm_base.scfg); iounmap(ls1_pm_base.dcfg); - iounmap(ls1_pm_base.fpga); + + if (ls1_pm_base.fpga) + iounmap(ls1_pm_base.fpga); + iounmap(ls1_pm_base.sram); } -static void ls1_setup_pmc_int(void) +static void ls1_deepsleep_irq(void) { u32 pmcintecr; + /* mask interrupts from GIC */ + iowrite32be(0x0ffffffff, ls1_pm_base.rcpm + CCSR_RCPM_NFIQOUTR); + iowrite32be(0x0ffffffff, ls1_pm_base.rcpm + CCSR_RCPM_NIRQOUTR); + /* mask deep sleep wake-up interrupts during deep sleep entry */ + iowrite32be(0x0ffffffff, ls1_pm_base.rcpm + CCSR_RCPM_DSIMSKR); + pmcintecr = 0; if (ippdexpcr0 & CCSR_RCPM_IPPDEXPCR0_ETSEC) pmcintecr |= CCSR_SCFG_PMCINTECR_ETSECRXG0 | @@ -173,11 +204,12 @@ static void ls1_setup_pmc_int(void) /* always set external IRQ pins as wakeup source */ pmcintecr |= CCSR_SCFG_PMCINTECR_IRQ0 | CCSR_SCFG_PMCINTECR_IRQ1; - /* enable wakeup interrupt during deep sleep */ - iowrite32be(pmcintecr, ls1_pm_base.scfg + CCSR_SCFG_PMCINTECR); iowrite32be(0, ls1_pm_base.scfg + CCSR_SCFG_PMCINTLECR); /* clear PMC interrupt status */ iowrite32be(0xffffffff, ls1_pm_base.scfg + CCSR_SCFG_PMCINTSR); + /* enable wakeup interrupt during deep sleep */ + iowrite32be(pmcintecr, ls1_pm_base.scfg + CCSR_SCFG_PMCINTECR); + } static void ls1_clear_pmc_int(void) @@ -299,15 +331,18 @@ static void ls1_enter_deepsleep(void) /* setup the registers of the EPU FSM for deep sleep */ ls1_fsm_setup(); - /* connect the EVENT button to IRQ in FPGA */ - tmp = ioread8(ls1_pm_base.fpga + QIXIS_CTL_SYS); - tmp &= ~QIXIS_CTL_SYS_EVTSW_MASK; - tmp |= QIXIS_CTL_SYS_EVTSW_IRQ; - iowrite8(tmp, ls1_pm_base.fpga + QIXIS_CTL_SYS); - - /* enable deep sleep signals in FPGA */ - tmp = ioread8(ls1_pm_base.fpga + QIXIS_PWR_CTL2); - iowrite8(tmp | QIXIS_PWR_CTL2_PCTL, ls1_pm_base.fpga + QIXIS_PWR_CTL2); + if (ls1_pm_base.fpga) { + /* connect the EVENT button to IRQ in FPGA */ + tmp = ioread8(ls1_pm_base.fpga + QIXIS_CTL_SYS); + tmp &= ~QIXIS_CTL_SYS_EVTSW_MASK; + tmp |= QIXIS_CTL_SYS_EVTSW_IRQ; + iowrite8(tmp, ls1_pm_base.fpga + QIXIS_CTL_SYS); + + /* enable deep sleep signals in FPGA */ + tmp = ioread8(ls1_pm_base.fpga + QIXIS_PWR_CTL2); + iowrite8(tmp | QIXIS_PWR_CTL2_PCTL, + ls1_pm_base.fpga + QIXIS_PWR_CTL2); + } /* enable Warm Device Reset */ ls1_clrsetbits_be32(ls1_pm_base.scfg + CCSR_SCFG_DPSLPCR, @@ -319,7 +354,7 @@ static void ls1_enter_deepsleep(void) /* copy the last stage code to sram */ ls1_copy_sram_code(); - ls1_setup_pmc_int(); + ls1_deepsleep_irq(); cpu_suspend(SRAM_CODE_BASE_PHY, ls1_start_deepsleep); @@ -329,9 +364,12 @@ static void ls1_enter_deepsleep(void) ls1_clrsetbits_be32(ls1_pm_base.scfg + CCSR_SCFG_DPSLPCR, CCSR_SCFG_DPSLPCR_VAL, 0); - /* disable deep sleep signals in FPGA */ - tmp = ioread8(ls1_pm_base.fpga + QIXIS_PWR_CTL2); - iowrite8(tmp & ~QIXIS_PWR_CTL2_PCTL, ls1_pm_base.fpga + QIXIS_PWR_CTL2); + if (ls1_pm_base.fpga) { + /* disable deep sleep signals in FPGA */ + tmp = ioread8(ls1_pm_base.fpga + QIXIS_PWR_CTL2); + iowrite8(tmp & ~QIXIS_PWR_CTL2_PCTL, + ls1_pm_base.fpga + QIXIS_PWR_CTL2); + } } static void ls1_set_power_except(struct device *dev, int on) @@ -367,11 +405,26 @@ static void ls1_set_wakeup_device(struct device *dev, void *enable) ls1_set_power_except(dev, *((int *)enable)); } +/* enable cluster to enter the PCL10 state */ +void ls1_set_clusterpm(int enable) +{ + u32 val; + + if (enable) + val = CCSR_SCFG_CLUSTERPMCR_WFIL2EN; + else + val = 0; + + BUG_ON(!ls1_pm_base.scfg); + iowrite32be(val, ls1_pm_base.scfg + CCSR_SCFG_CLUSTERPMCR); +} + static int ls1_suspend_enter(suspend_state_t state) { int ret = 0; ls1_set_powerdown(); + ls1_set_clusterpm(1); switch (state) { case PM_SUSPEND_STANDBY: @@ -391,6 +444,7 @@ static int ls1_suspend_enter(suspend_state_t state) ret = -EINVAL; } + ls1_set_clusterpm(0); return ret; } @@ -414,7 +468,9 @@ static int ls1_suspend_begin(suspend_state_t state) dpm_for_each_dev(NULL, ls1_set_wakeup_device); if (ls1_pm_state == PM_SUSPEND_MEM) - ls1_pm_iomap(); + return ls1_pm_iomap(1); + else if (ls1_pm_state == PM_SUSPEND_STANDBY) + return ls1_pm_iomap(0); return 0; } @@ -422,7 +478,9 @@ static int ls1_suspend_begin(suspend_state_t state) static void ls1_suspend_end(void) { if (ls1_pm_state == PM_SUSPEND_MEM) - ls1_pm_uniomap(); + ls1_pm_uniomap(1); + else if (ls1_pm_state == PM_SUSPEND_STANDBY) + ls1_pm_uniomap(0); } static const struct platform_suspend_ops ls1_suspend_ops = { diff --git a/arch/arm/mach-imx/sleep-ls1.S b/arch/arm/mach-imx/sleep-ls1.S index b8d7f1a..f8fd8a4 100644 --- a/arch/arm/mach-imx/sleep-ls1.S +++ b/arch/arm/mach-imx/sleep-ls1.S @@ -25,6 +25,10 @@ #define DCSR_EPU_EPECR0 0x300 #define DCSR_EPU_EPECR15 0x33c +#define CCSR_GIC_BASE 0x1400000 +#define CCSR_GICD_CTLR 0x1000 +#define CCSR_GICC_CTLR 0x2000 + /* for big endian registers */ .macro ls1_set_bits, addr, value ldr r4, \addr @@ -85,6 +89,13 @@ ENTRY(ls1_start_fsm) ls1_delay #2000 + mov r7, #0 + ldr r8, ls1_ccsr_gicd_ctlr + str r7, [r8] + ldr r9, ls1_ccsr_gicc_ctlr + str r7, [r9] + dsb + /* Enable all EPU Counters */ ls1_set_bits ls1_dcsr_epu_epgcr_addr, ls1_dcsr_epu_epgcr_val @@ -92,8 +103,10 @@ ENTRY(ls1_start_fsm) ls1_set_bits ls1_dcsr_epu_epecr15, ls1_dcsr_epu_epecr15_val /* Enter WFI mode, and EPU FSM will start */ -20: wfi - b 20b + isb + wfi + nop +20: b 20b ls1_ccsr_scfg_hrstcr_addr: .word CCSR_SCFG_BASE + CCSR_SCFG_HRSTCR @@ -120,6 +133,12 @@ ls1_dcsr_epu_epecr15: ls1_dcsr_epu_epecr15_val: .word 0x90000004 +ls1_ccsr_gicd_ctlr: + .word CCSR_GIC_BASE + CCSR_GICD_CTLR + +ls1_ccsr_gicc_ctlr: + .word CCSR_GIC_BASE + CCSR_GICC_CTLR + ENTRY(ls1_sram_code_size) .word . - ls1_start_fsm diff --git a/drivers/crypto/caam/ctrl.c b/drivers/crypto/caam/ctrl.c index 321deb0..0359c71 100644 --- a/drivers/crypto/caam/ctrl.c +++ b/drivers/crypto/caam/ctrl.c @@ -388,14 +388,14 @@ static void kick_trng(struct device *dev, int ent_delay) int caam_get_era(void) { struct device_node *caam_node; - for_each_compatible_node(caam_node, NULL, "fsl,sec-v4.0") { - const uint32_t *prop = (uint32_t *)of_get_property(caam_node, - "fsl,sec-era", - NULL); - return prop ? *prop : -ENOTSUPP; - } + int ret; + u32 prop; + + caam_node = of_find_compatible_node(NULL, NULL, "fsl,sec-v4.0"); + ret = of_property_read_u32(caam_node, "fsl,sec-era", &prop); + of_node_put(caam_node); - return -ENOTSUPP; + return IS_ERR_VALUE(ret) ? -ENOTSUPP : prop; } EXPORT_SYMBOL(caam_get_era); @@ -488,7 +488,7 @@ static int caam_probe(struct platform_device *pdev) #ifdef CONFIG_DEBUG_FS struct caam_perfmon *perfmon; #endif - u32 scfgr, comp_params; + u32 mcr, scfgr, comp_params; int pg_size; int BLOCK_OFFSET = 0; @@ -537,8 +537,11 @@ static int caam_probe(struct platform_device *pdev) * Enable DECO watchdogs and, if this is a PHYS_ADDR_T_64BIT kernel, * long pointers in master configuration register */ - setbits32(&ctrl->mcr, MCFGR_WDENABLE | - (sizeof(dma_addr_t) == sizeof(u64) ? MCFGR_LONG_PTR : 0)); + mcr = rd_reg32(&ctrl->mcr); + mcr = (mcr & ~MCFGR_AWCACHE_MASK) | (0x2 << MCFGR_AWCACHE_SHIFT) | + MCFGR_WDENABLE | (sizeof(dma_addr_t) == sizeof(u64) ? + MCFGR_LONG_PTR : 0); + wr_reg32(&ctrl->mcr, mcr); /* * Read the Compile Time paramters and SCFGR to determine @@ -817,6 +820,7 @@ static int caam_resume(struct device *dev) struct caam_drv_private *caam_priv; struct caam_ctrl __iomem *ctrl; struct caam_queue_if __iomem *qi; + u32 mcr; int ret; caam_priv = dev_get_drvdata(dev); @@ -826,8 +830,11 @@ static int caam_resume(struct device *dev) * Enable DECO watchdogs and, if this is a PHYS_ADDR_T_64BIT kernel, * long pointers in master configuration register */ - setbits32(&ctrl->mcr, MCFGR_WDENABLE | - (sizeof(dma_addr_t) == sizeof(u64) ? MCFGR_LONG_PTR : 0)); + mcr = rd_reg32(&ctrl->mcr); + mcr = (mcr & ~MCFGR_AWCACHE_MASK) | (0x2 << MCFGR_AWCACHE_SHIFT) | + MCFGR_WDENABLE | (sizeof(dma_addr_t) == sizeof(u64) ? + MCFGR_LONG_PTR : 0); + wr_reg32(&ctrl->mcr, mcr); /* Enable QI interface of SEC */ if (caam_priv->qi_present) diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c index 5c7c168..c1a37a6 100644 --- a/drivers/mmc/host/sdhci-pltfm.c +++ b/drivers/mmc/host/sdhci-pltfm.c @@ -112,7 +112,8 @@ void sdhci_get_of_property(struct platform_device *pdev) of_device_is_compatible(np, "fsl,p5020-esdhc") || of_device_is_compatible(np, "fsl,p4080-esdhc") || of_device_is_compatible(np, "fsl,t1040-esdhc") || - of_device_is_compatible(np, "fsl,p1020-esdhc")) + of_device_is_compatible(np, "fsl,p1020-esdhc") || + of_device_is_compatible(np, "fsl,ls1021a-esdhc")) host->quirks &= ~SDHCI_QUIRK_BROKEN_CARD_DETECTION; clk = of_get_property(np, "clock-frequency", &size); diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 7a0baef..8f0e396 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -132,27 +132,6 @@ static void sdhci_dumpregs(struct sdhci_host *host) * * \*****************************************************************************/ -static void sdhci_clear_set_irqs(struct sdhci_host *host, u32 clear, u32 set) -{ - u32 ier; - - ier = sdhci_readl(host, SDHCI_INT_ENABLE); - ier &= ~clear; - ier |= set; - sdhci_writel(host, ier, SDHCI_INT_ENABLE); - sdhci_writel(host, ier, SDHCI_SIGNAL_ENABLE); -} - -static void sdhci_unmask_irqs(struct sdhci_host *host, u32 irqs) -{ - sdhci_clear_set_irqs(host, 0, irqs); -} - -static void sdhci_mask_irqs(struct sdhci_host *host, u32 irqs) -{ - sdhci_clear_set_irqs(host, irqs, 0); -} - static void sdhci_set_card_detection(struct sdhci_host *host, bool enable) { u32 present, irqs; @@ -166,9 +145,12 @@ static void sdhci_set_card_detection(struct sdhci_host *host, bool enable) irqs = present ? SDHCI_INT_CARD_REMOVE : SDHCI_INT_CARD_INSERT; if (enable) - sdhci_unmask_irqs(host, irqs); + host->ier |= irqs; else - sdhci_mask_irqs(host, irqs); + host->ier &= ~irqs; + + sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); + sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); } static void sdhci_enable_card_detection(struct sdhci_host *host) @@ -184,7 +166,6 @@ static void sdhci_disable_card_detection(struct sdhci_host *host) void sdhci_reset(struct sdhci_host *host, u8 mask) { unsigned long timeout; - u32 uninitialized_var(ier); if (host->quirks & SDHCI_QUIRK_NO_CARD_NO_RESET) { if (!(sdhci_readl(host, SDHCI_PRESENT_STATE) & @@ -192,9 +173,6 @@ void sdhci_reset(struct sdhci_host *host, u8 mask) return; } - if (host->quirks & SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET) - ier = sdhci_readl(host, SDHCI_INT_ENABLE); - if (host->ops->platform_reset_enter) host->ops->platform_reset_enter(host, mask); @@ -225,8 +203,10 @@ void sdhci_reset(struct sdhci_host *host, u8 mask) if (host->ops->platform_reset_exit) host->ops->platform_reset_exit(host, mask); - if (host->quirks & SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET) - sdhci_clear_set_irqs(host, SDHCI_INT_ALL_MASK, ier); + if (host->quirks & SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET) { + sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); + sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); + } if (host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) { if ((host->ops->enable_dma) && (mask & SDHCI_RESET_ALL)) @@ -238,25 +218,26 @@ static void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios); static void sdhci_init(struct sdhci_host *host, int soft) { - u32 pltm_irq = 0, irq = 0; + u32 pltm_irq = 0; if (soft) sdhci_reset(host, SDHCI_RESET_CMD|SDHCI_RESET_DATA); else sdhci_reset(host, SDHCI_RESET_ALL); - irq = SDHCI_INT_BUS_POWER | SDHCI_INT_DATA_END_BIT | + host->ier = SDHCI_INT_BUS_POWER | SDHCI_INT_DATA_END_BIT | SDHCI_INT_DATA_CRC | SDHCI_INT_DATA_TIMEOUT | SDHCI_INT_INDEX | SDHCI_INT_END_BIT | SDHCI_INT_CRC | SDHCI_INT_TIMEOUT | SDHCI_INT_DATA_END | SDHCI_INT_RESPONSE; if (pltm_irq) - irq |= pltm_irq; + host->ier |= pltm_irq; if (host->flags & SDHCI_AUTO_CMD12) - irq |= SDHCI_INT_ACMD12ERR; + host->ier |= SDHCI_INT_ACMD12ERR; - sdhci_clear_set_irqs(host, SDHCI_INT_ALL_MASK, irq); + sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); + sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); if (soft) { /* force clock reconfiguration */ @@ -731,9 +712,12 @@ static void sdhci_set_transfer_irqs(struct sdhci_host *host) u32 dma_irqs = SDHCI_INT_DMA_END | SDHCI_INT_ADMA_ERROR; if (host->flags & SDHCI_REQ_USE_DMA) - sdhci_clear_set_irqs(host, pio_irqs, dma_irqs); + host->ier = (host->ier & ~pio_irqs) | dma_irqs; else - sdhci_clear_set_irqs(host, dma_irqs, pio_irqs); + host->ier = (host->ier & ~dma_irqs) | pio_irqs; + + sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); + sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); } static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd) @@ -1733,9 +1717,12 @@ static void sdhci_enable_sdio_irq_nolock(struct sdhci_host *host, int enable) goto out; if (enable) - sdhci_unmask_irqs(host, SDHCI_INT_CARD_INT); + host->ier |= SDHCI_INT_CARD_INT; else - sdhci_mask_irqs(host, SDHCI_INT_CARD_INT); + host->ier &= ~SDHCI_INT_CARD_INT; + + sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); + sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); out: mmiowb(); } @@ -1868,7 +1855,6 @@ static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode) { struct sdhci_host *host; u16 ctrl; - u32 ier; int tuning_loop_counter = MAX_TUNING_LOOP; unsigned long timeout; int err = 0; @@ -1916,8 +1902,8 @@ static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode) * to make sure we don't hit a controller bug, we _only_ * enable Buffer Read Ready interrupt here. */ - ier = sdhci_readl(host, SDHCI_INT_ENABLE); - sdhci_clear_set_irqs(host, ier, SDHCI_INT_DATA_AVAIL); + sdhci_writel(host, SDHCI_INT_DATA_AVAIL, SDHCI_INT_ENABLE); + sdhci_writel(host, SDHCI_INT_DATA_AVAIL, SDHCI_SIGNAL_ENABLE); /* * Issue CMD19 repeatedly till Execute Tuning is set to 0 or the number @@ -2052,7 +2038,8 @@ out: if (err && (host->flags & SDHCI_USING_RETUNING_TIMER)) err = 0; - sdhci_clear_set_irqs(host, SDHCI_INT_DATA_AVAIL, ier); + sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); + sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); spin_unlock(&host->lock); enable_irq(host->irq); sdhci_runtime_pm_put(host); @@ -2480,10 +2467,11 @@ again: * More testing are needed here to ensure it works for other * platforms though. */ - sdhci_mask_irqs(host, present ? SDHCI_INT_CARD_INSERT : - SDHCI_INT_CARD_REMOVE); - sdhci_unmask_irqs(host, present ? SDHCI_INT_CARD_REMOVE : - SDHCI_INT_CARD_INSERT); + host->ier &= ~(SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE); + host->ier |= present ? SDHCI_INT_CARD_REMOVE : + SDHCI_INT_CARD_INSERT; + sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); + sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); sdhci_writel(host, intmask & (SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE), SDHCI_INT_STATUS); @@ -2609,7 +2597,9 @@ int sdhci_suspend_host(struct sdhci_host *host) } if (!device_may_wakeup(mmc_dev(host->mmc))) { - sdhci_mask_irqs(host, SDHCI_INT_ALL_MASK); + host->ier = 0; + sdhci_writel(host, 0, SDHCI_INT_ENABLE); + sdhci_writel(host, 0, SDHCI_SIGNAL_ENABLE); free_irq(host->irq, host); } else { sdhci_enable_irq_wakeups(host); @@ -2708,7 +2698,9 @@ int sdhci_runtime_suspend_host(struct sdhci_host *host) } spin_lock_irqsave(&host->lock, flags); - sdhci_mask_irqs(host, SDHCI_INT_ALL_MASK); + host->ier = 0; + sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); + sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); spin_unlock_irqrestore(&host->lock, flags); synchronize_irq(host->irq); @@ -3307,7 +3299,8 @@ int sdhci_add_host(struct sdhci_host *host) #ifdef SDHCI_USE_LEDS_CLASS reset: sdhci_reset(host, SDHCI_RESET_ALL); - sdhci_mask_irqs(host, SDHCI_INT_ALL_MASK); + sdhci_writel(host, 0, SDHCI_INT_ENABLE); + sdhci_writel(host, 0, SDHCI_SIGNAL_ENABLE); free_irq(host->irq, host); #endif untasklet: @@ -3350,7 +3343,8 @@ void sdhci_remove_host(struct sdhci_host *host, int dead) if (!dead) sdhci_reset(host, SDHCI_RESET_ALL); - sdhci_mask_irqs(host, SDHCI_INT_ALL_MASK); + sdhci_writel(host, 0, SDHCI_INT_ENABLE); + sdhci_writel(host, 0, SDHCI_SIGNAL_ENABLE); free_irq(host->irq, host); del_timer_sync(&host->timer); diff --git a/drivers/net/can/Kconfig b/drivers/net/can/Kconfig index 5115a36..3c06947 100644 --- a/drivers/net/can/Kconfig +++ b/drivers/net/can/Kconfig @@ -108,18 +108,6 @@ config CAN_FLEXCAN ---help--- Say Y here if you want to support for Freescale FlexCAN. -config CAN_FLEXCAN_RX_FIFO_EN - tristate "Support for RX FIFO mode in Freescale FLEXCAN based chips" - depends on CAN_FLEXCAN - ---help--- - Say Y here if your Freescale SoC's FlexCAN module has support for RX FIFO MODE. - -config CAN_FLEXCAN_ERRATA_ERR005829 - tristate "ERRATA_ERR005829 applicable to certain variants of Freescale FLEXCAN based chips" - depends on CAN_FLEXCAN - ---help--- - Say Y here if your Freescale SoC's FlexCAN module needs s/w workaround for ERRATA ERR005829. - config PCH_CAN tristate "Intel EG20T PCH CAN controller" depends on PCI diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c index 805a923..b24352f 100644 --- a/drivers/net/can/flexcan.c +++ b/drivers/net/can/flexcan.c @@ -59,7 +59,6 @@ #define FLEXCAN_MCR_WAK_SRC BIT(19) #define FLEXCAN_MCR_DOZE BIT(18) #define FLEXCAN_MCR_SRX_DIS BIT(17) -#define FLEXCAN_MCR_SRX_EN ~(BIT(17)) #define FLEXCAN_MCR_BCC BIT(16) #define FLEXCAN_MCR_LPRIO_EN BIT(13) #define FLEXCAN_MCR_AEN BIT(12) @@ -147,25 +146,19 @@ FLEXCAN_ESR_BOFF_INT | FLEXCAN_ESR_ERR_INT) /* FLEXCAN interrupt flag register (IFLAG) bits */ -#ifdef CONFIG_CAN_FLEXCAN_ERRATA_ERR005829 /* Errata ERR005829 step7: Reserve first valid MB */ #define FLEXCAN_TX_BUF_RESERVED 8 #define FLEXCAN_TX_BUF_ID 9 -#else -#define FLEXCAN_TX_BUF_ID 8 -#endif #define FLEXCAN_IFLAG_BUF(x) BIT(x) #define FLEXCAN_IFLAG_RX_FIFO_OVERFLOW BIT(7) #define FLEXCAN_IFLAG_RX_FIFO_WARN BIT(6) #define FLEXCAN_IFLAG_RX_FIFO_AVAILABLE BIT(5) -#ifdef CONFIG_CAN_FLEXCAN_RX_FIFO_EN #define FLEXCAN_IFLAG_DEFAULT \ (FLEXCAN_IFLAG_RX_FIFO_OVERFLOW | FLEXCAN_IFLAG_RX_FIFO_AVAILABLE | \ FLEXCAN_IFLAG_BUF(FLEXCAN_TX_BUF_ID)) -#else -#define FLEXCAN_IFLAG_DEFAULT \ - (FLEXCAN_IFLAG_BUF(FLEXCAN_TX_BUF_ID)) -#endif +#define FLEXCAN_IFLAG_DEFAULT_RX_MB_MODE \ + (FLEXCAN_IFLAG_BUF(FLEXCAN_TX_BUF_ID)) +#define FLEXCAN_IFLAG_RX_MB_RXMASK ((1 << FLEXCAN_TX_BUF_RESERVED) - 1) /* FLEXCAN message buffers */ #define FLEXCAN_MB_CNT_CODE(x) (((x) & 0xf) << 24) @@ -208,6 +201,8 @@ #define FLEXCAN_HAS_V10_FEATURES BIT(1) /* For core version >= 10 */ #define FLEXCAN_HAS_BROKEN_ERR_STATE BIT(2) /* [TR]WRN_INT not connected */ #define FLEXCAN_HAS_MECR_FEATURES BIT(3) /* Memory error detection */ +#define FLEXCAN_HAS_ONLY_LEGACY_RX_SUPPORT \ + BIT(4) /* No RX FIFO mode support */ /* Structure of the message buffer */ struct flexcan_mb { @@ -263,6 +258,7 @@ struct flexcan_priv { void __iomem *base; u32 reg_esr; u32 reg_ctrl_default; + u32 rx_msg_buf; struct clk *clk_ipg; struct clk *clk_per; @@ -271,8 +267,8 @@ struct flexcan_priv { struct regulator *reg_xceiver; /* Read and Write APIs */ - u32 (*read) (void __iomem *addr); - void (*write) (u32 val, void __iomem *addr); + u32 (*read)(void __iomem *addr); + void (*write)(u32 val, void __iomem *addr); }; static struct flexcan_devtype_data fsl_p1010_devtype_data = { @@ -287,7 +283,18 @@ static struct flexcan_devtype_data fsl_vf610_devtype_data = { .features = FLEXCAN_HAS_V10_FEATURES | FLEXCAN_HAS_MECR_FEATURES, }; +/* LS1021A-Rev1 has a broken RX-FIFO support. So only legacy RX message-buffers + * work here. + */ static struct flexcan_devtype_data fsl_ls1021a_devtype_data = { + .features = FLEXCAN_HAS_V10_FEATURES | FLEXCAN_HAS_MECR_FEATURES | + FLEXCAN_HAS_ONLY_LEGACY_RX_SUPPORT, +}; + +/* LS1021A-Rev2 has functional RX-FIFO mode, so no need to fall back to + * the legacy mode. + */ +static struct flexcan_devtype_data fsl_ls1021a_r2_devtype_data = { .features = FLEXCAN_HAS_V10_FEATURES | FLEXCAN_HAS_MECR_FEATURES, }; @@ -303,8 +310,7 @@ static const struct can_bittiming_const flexcan_bittiming_const = { .brp_inc = 1, }; -/* - * FlexCAN module is essentially modelled as a little-endian IP in most +/* FlexCAN module is essentially modelled as a little-endian IP in most * SoCs, i.e the registers as well as the message buffer areas are * implemented in a little-endian fashion. * @@ -315,7 +321,7 @@ static const struct can_bittiming_const flexcan_bittiming_const = { * In addition, the FlexCAN module can be found on SoCs having ARM or * PPC cores. So, we need to abstract off the register read/write * functions, ensuring that these cater to all the combinations of module - * endianess and underlying CPU endianess. + * endianness and underlying CPU endianness. */ static inline u32 flexcan_read_le(void __iomem *addr) { @@ -425,7 +431,6 @@ static int flexcan_chip_unfreeze(struct flexcan_priv *priv) reg = priv->read(®s->mcr); reg &= ~FLEXCAN_MCR_HALT; - reg &= ~FLEXCAN_MCR_FRZ; priv->write(reg, ®s->mcr); while (timeout-- && (priv->read(®s->mcr) & FLEXCAN_MCR_FRZ_ACK)) @@ -452,7 +457,6 @@ static int flexcan_chip_softreset(struct flexcan_priv *priv) return 0; } - static int __flexcan_get_berr_counter(const struct net_device *dev, struct can_berr_counter *bec) { @@ -525,7 +529,7 @@ static int flexcan_start_xmit(struct sk_buff *skb, struct net_device *dev) priv->write(can_id, ®s->cantxfg[FLEXCAN_TX_BUF_ID].can_id); priv->write(ctrl, ®s->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl); -#ifdef CONFIG_CAN_FLEXCAN_ERRATA_ERR005829 + /* Errata ERR005829 step8: * Write twice INACTIVE(0x8) code to first MB. */ @@ -533,11 +537,6 @@ static int flexcan_start_xmit(struct sk_buff *skb, struct net_device *dev) ®s->cantxfg[FLEXCAN_TX_BUF_RESERVED].can_ctrl); priv->write(FLEXCAN_MB_CODE_TX_INACTIVE, ®s->cantxfg[FLEXCAN_TX_BUF_RESERVED].can_ctrl); -#endif - -#ifndef CONFIG_CAN_FLEXCAN_RX_FIFO_EN - netdev_info(dev, "XMIT done\n"); -#endif return NETDEV_TX_OK; } @@ -719,13 +718,10 @@ static int flexcan_poll_state(struct net_device *dev, u32 reg_esr) return 1; } -#ifdef CONFIG_CAN_FLEXCAN_RX_FIFO_EN -static void flexcan_read_fifo(const struct net_device *dev, - struct can_frame *cf) +static void flexcan_read_can_frame(const struct flexcan_priv *priv, + struct flexcan_mb __iomem *mb, + struct can_frame *cf) { - const struct flexcan_priv *priv = netdev_priv(dev); - struct flexcan_regs __iomem *regs = priv->base; - struct flexcan_mb __iomem *mb = ®s->cantxfg[0]; u32 reg_ctrl, reg_id; reg_ctrl = priv->read(&mb->can_ctrl); @@ -741,67 +737,39 @@ static void flexcan_read_fifo(const struct net_device *dev, *(__be32 *)(cf->data + 0) = cpu_to_be32(priv->read(&mb->data[0])); *(__be32 *)(cf->data + 4) = cpu_to_be32(priv->read(&mb->data[1])); - - /* mark as read */ - priv->write(FLEXCAN_IFLAG_RX_FIFO_AVAILABLE, ®s->iflag1); - priv->read(®s->timer); } -#else -static void flexcan_read_mailbox(const struct net_device *dev, - struct can_frame *cf, u32 mailbox) + +static void flexcan_read_fifo(const struct net_device *dev, + struct can_frame *cf) { const struct flexcan_priv *priv = netdev_priv(dev); struct flexcan_regs __iomem *regs = priv->base; - struct flexcan_mb __iomem *mb = ®s->cantxfg[mailbox]; - u32 reg_ctrl, reg_id; - - reg_ctrl = priv->read(&mb->can_ctrl); - reg_id = priv->read(&mb->can_id); - if (reg_ctrl & FLEXCAN_MB_CNT_IDE) - cf->can_id = ((reg_id >> 0) & CAN_EFF_MASK) | CAN_EFF_FLAG; - else - cf->can_id = (reg_id >> 18) & CAN_SFF_MASK; - - if (reg_ctrl & FLEXCAN_MB_CNT_RTR) - cf->can_id |= CAN_RTR_FLAG; - cf->can_dlc = get_can_dlc((reg_ctrl >> 16) & 0xf); + struct flexcan_mb __iomem *mb = ®s->cantxfg[0]; - *(__be32 *)(cf->data + 0) = cpu_to_be32(priv->read(&mb->data[0])); - *(__be32 *)(cf->data + 4) = cpu_to_be32(priv->read(&mb->data[1])); + flexcan_read_can_frame(priv, mb, cf); /* mark as read */ - priv->write(BIT(mailbox), ®s->iflag1); + priv->write(FLEXCAN_IFLAG_RX_FIFO_AVAILABLE, ®s->iflag1); priv->read(®s->timer); } -#endif -#ifdef CONFIG_CAN_FLEXCAN_RX_FIFO_EN -static int flexcan_read_frame_fifo_mode(struct net_device *dev) +static void flexcan_read_msg_buf(const struct net_device *dev, + struct can_frame *cf, u32 msg_buf) { - struct net_device_stats *stats = &dev->stats; - struct can_frame *cf; - struct sk_buff *skb; - - skb = alloc_can_skb(dev, &cf); - if (unlikely(!skb)) { - stats->rx_dropped++; - return 0; - } - - flexcan_read_fifo(dev, cf); - - netif_receive_skb(skb); - - stats->rx_packets++; - stats->rx_bytes += cf->can_dlc; + const struct flexcan_priv *priv = netdev_priv(dev); + struct flexcan_regs __iomem *regs = priv->base; + struct flexcan_mb __iomem *mb = ®s->cantxfg[msg_buf]; - can_led_event(dev, CAN_LED_EVENT_RX); + flexcan_read_can_frame(priv, mb, cf); - return 1; + /* mark as read */ + priv->write(BIT(msg_buf), ®s->iflag1); + priv->read(®s->timer); } -#else -static int flexcan_read_frame_legacy_mode(struct net_device *dev, u32 mailbox) + +static int flexcan_read_frame(struct net_device *dev) { + const struct flexcan_priv *priv = netdev_priv(dev); struct net_device_stats *stats = &dev->stats; struct can_frame *cf; struct sk_buff *skb; @@ -812,7 +780,10 @@ static int flexcan_read_frame_legacy_mode(struct net_device *dev, u32 mailbox) return 0; } - flexcan_read_mailbox(dev, cf, mailbox); + if (priv->devtype_data->features & FLEXCAN_HAS_ONLY_LEGACY_RX_SUPPORT) + flexcan_read_msg_buf(dev, cf, priv->rx_msg_buf); + else + flexcan_read_fifo(dev, cf); netif_receive_skb(skb); @@ -823,14 +794,14 @@ static int flexcan_read_frame_legacy_mode(struct net_device *dev, u32 mailbox) return 1; } -#endif static int flexcan_poll(struct napi_struct *napi, int quota) { struct net_device *dev = napi->dev; - const struct flexcan_priv *priv = netdev_priv(dev); + struct flexcan_priv *priv = netdev_priv(dev); struct flexcan_regs __iomem *regs = priv->base; u32 reg_iflag1, reg_esr; + unsigned long iflag1; int work_done = 0; /* @@ -842,28 +813,26 @@ static int flexcan_poll(struct napi_struct *napi, int quota) /* handle state changes */ work_done += flexcan_poll_state(dev, reg_esr); -#ifdef CONFIG_CAN_FLEXCAN_RX_FIFO_EN - /* handle RX-FIFO */ reg_iflag1 = priv->read(®s->iflag1); - while (reg_iflag1 & FLEXCAN_IFLAG_RX_FIFO_AVAILABLE && - work_done < quota) { - work_done += flexcan_read_frame_fifo_mode(dev); - reg_iflag1 = priv->read(®s->iflag1); - } -#else - unsigned long iflag1; - u32 mailbox; - /* handle RX-Buffers */ - reg_iflag1 = priv->read(®s->iflag1); - iflag1 = reg_iflag1 & (FLEXCAN_TX_BUF_ID - 1); - while ((reg_iflag1 & (FLEXCAN_TX_BUF_ID - 1)) && - work_done < quota) { - mailbox = find_first_bit(&iflag1, (FLEXCAN_TX_BUF_ID - 1)); - work_done += flexcan_read_frame_legacy_mode(dev, mailbox); - reg_iflag1 = priv->read(®s->iflag1); + if (priv->devtype_data->features & FLEXCAN_HAS_ONLY_LEGACY_RX_SUPPORT) { + /* handle legacy RX mode */ + iflag1 = reg_iflag1 & FLEXCAN_IFLAG_RX_MB_RXMASK; + while ((reg_iflag1 & FLEXCAN_IFLAG_RX_MB_RXMASK) && + work_done < quota) { + priv->rx_msg_buf = find_first_bit(&iflag1, + (FLEXCAN_TX_BUF_ID - 1)); + work_done += flexcan_read_frame(dev); + reg_iflag1 = priv->read(®s->iflag1); + } + } else { + /* handle RX-FIFO */ + while (reg_iflag1 & FLEXCAN_IFLAG_RX_FIFO_AVAILABLE && + work_done < quota) { + work_done += flexcan_read_frame(dev); + reg_iflag1 = priv->read(®s->iflag1); + } } -#endif /* report bus errors */ if (flexcan_has_and_handle_berr(priv, reg_esr) && work_done < quota) @@ -872,7 +841,13 @@ static int flexcan_poll(struct napi_struct *napi, int quota) if (work_done < quota) { napi_complete(napi); /* enable IRQs */ - priv->write(FLEXCAN_IFLAG_DEFAULT, ®s->imask1); + if (priv->devtype_data->features & + FLEXCAN_HAS_ONLY_LEGACY_RX_SUPPORT) + priv->write(FLEXCAN_IFLAG_DEFAULT_RX_MB_MODE | + FLEXCAN_IFLAG_RX_MB_RXMASK, ®s->imask1); + else + priv->write(FLEXCAN_IFLAG_DEFAULT, ®s->imask1); + priv->write(priv->reg_ctrl_default, ®s->ctrl); } @@ -899,53 +874,54 @@ static irqreturn_t flexcan_irq(int irq, void *dev_id) * - state change IRQ * - bus error IRQ and bus error reporting is activated */ -#ifdef CONFIG_CAN_FLEXCAN_RX_FIFO_EN - if ((reg_iflag1 & FLEXCAN_IFLAG_RX_FIFO_AVAILABLE) || - (reg_esr & FLEXCAN_ESR_ERR_STATE) || - flexcan_has_and_handle_berr(priv, reg_esr)) { - /* - * The error bits are cleared on read, - * save them for later use. - */ - priv->reg_esr = reg_esr & FLEXCAN_ESR_ERR_BUS; - priv->write(FLEXCAN_IFLAG_DEFAULT & - ~FLEXCAN_IFLAG_RX_FIFO_AVAILABLE, ®s->imask1); - priv->write(priv->reg_ctrl_default & ~FLEXCAN_CTRL_ERR_ALL, - ®s->ctrl); - napi_schedule(&priv->napi); - } + if (priv->devtype_data->features & FLEXCAN_HAS_ONLY_LEGACY_RX_SUPPORT) { + if ((reg_iflag1 & FLEXCAN_IFLAG_RX_MB_RXMASK) || + (reg_esr & FLEXCAN_ESR_ERR_STATE) || + flexcan_has_and_handle_berr(priv, reg_esr)) { + /* The error bits are cleared on read, + * save them for later use. + */ + priv->reg_esr = reg_esr & FLEXCAN_ESR_ERR_BUS; + priv->write(FLEXCAN_IFLAG_DEFAULT_RX_MB_MODE & + ~FLEXCAN_IFLAG_RX_MB_RXMASK, ®s->imask1); + priv->write(priv->reg_ctrl_default & + ~FLEXCAN_CTRL_ERR_ALL, ®s->ctrl); + + napi_schedule(&priv->napi); + } + } else { + if ((reg_iflag1 & FLEXCAN_IFLAG_RX_FIFO_AVAILABLE) || + (reg_esr & FLEXCAN_ESR_ERR_STATE) || + flexcan_has_and_handle_berr(priv, reg_esr)) { + /* The error bits are cleared on read, + * save them for later use. + */ + priv->reg_esr = reg_esr & FLEXCAN_ESR_ERR_BUS; + priv->write(FLEXCAN_IFLAG_DEFAULT & + ~FLEXCAN_IFLAG_RX_FIFO_AVAILABLE, + ®s->imask1); + priv->write(priv->reg_ctrl_default & + ~FLEXCAN_CTRL_ERR_ALL, ®s->ctrl); + napi_schedule(&priv->napi); + } - /* FIFO overflow */ - if (reg_iflag1 & FLEXCAN_IFLAG_RX_FIFO_OVERFLOW) { - priv->write(FLEXCAN_IFLAG_RX_FIFO_OVERFLOW, ®s->iflag1); - dev->stats.rx_over_errors++; - dev->stats.rx_errors++; - } -#else - if ((reg_iflag1 & (FLEXCAN_TX_BUF_ID - 1)) || - (reg_esr & FLEXCAN_ESR_ERR_STATE) || - flexcan_has_and_handle_berr(priv, reg_esr)) { - /* - * The error bits are cleared on read, - * save them for later use. - */ - priv->reg_esr = reg_esr & FLEXCAN_ESR_ERR_BUS; - priv->write(priv->reg_ctrl_default & ~FLEXCAN_CTRL_ERR_ALL, - ®s->ctrl); - napi_schedule(&priv->napi); + /* FIFO overflow */ + if (reg_iflag1 & FLEXCAN_IFLAG_RX_FIFO_OVERFLOW) { + priv->write(FLEXCAN_IFLAG_RX_FIFO_OVERFLOW, + ®s->iflag1); + dev->stats.rx_over_errors++; + dev->stats.rx_errors++; + } } -#endif /* transmission complete interrupt */ if (reg_iflag1 & (1 << FLEXCAN_TX_BUF_ID)) { stats->tx_bytes += can_get_echo_skb(dev, 0); stats->tx_packets++; can_led_event(dev, CAN_LED_EVENT_TX); -#ifndef CONFIG_CAN_FLEXCAN_RX_FIFO_EN /* after sending a RTR frame mailbox is in RX mode */ priv->write(FLEXCAN_MB_CODE_TX_INACTIVE, ®s->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl); -#endif priv->write((1 << FLEXCAN_TX_BUF_ID), ®s->iflag1); netif_wake_queue(dev); } @@ -1031,18 +1007,23 @@ static int flexcan_chip_start(struct net_device *dev) */ reg_mcr = priv->read(®s->mcr); reg_mcr &= ~FLEXCAN_MCR_MAXMB(0xff); -#ifdef CONFIG_CAN_FLEXCAN_RX_FIFO_EN - reg_mcr |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_FEN | FLEXCAN_MCR_HALT | + if (priv->devtype_data->features & FLEXCAN_HAS_ONLY_LEGACY_RX_SUPPORT) + reg_mcr &= ~FLEXCAN_MCR_FEN; + else + reg_mcr |= FLEXCAN_MCR_FEN; + +#if 0 + reg_mcr |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_HALT | FLEXCAN_MCR_SUPV | FLEXCAN_MCR_WRN_EN | FLEXCAN_MCR_IDAM_C | FLEXCAN_MCR_SRX_DIS | FLEXCAN_MCR_MAXMB(FLEXCAN_TX_BUF_ID); #else reg_mcr |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_HALT | FLEXCAN_MCR_SUPV | FLEXCAN_MCR_WRN_EN | - FLEXCAN_MCR_IDAM_A | - FLEXCAN_MCR_MAXMB(FLEXCAN_TX_BUF_ID); - reg_mcr &= FLEXCAN_MCR_SRX_EN; + FLEXCAN_MCR_IDAM_C | FLEXCAN_MCR_MAXMB(FLEXCAN_TX_BUF_ID); + reg_mcr &= ~FLEXCAN_MCR_SRX_DIS; #endif + netdev_dbg(dev, "%s: writing mcr=0x%08x", __func__, reg_mcr); priv->write(reg_mcr, ®s->mcr); @@ -1079,47 +1060,26 @@ static int flexcan_chip_start(struct net_device *dev) priv->write(reg_ctrl, ®s->ctrl); /* clear and invalidate all mailboxes first */ -#ifndef CONFIG_CAN_FLEXCAN_RX_FIFO_EN - for (i = 0; i < ARRAY_SIZE(regs->cantxfg); i++) { - priv->write(0, ®s->cantxfg[i].can_ctrl); - priv->write(0, ®s->cantxfg[i].can_id); - priv->write(0, ®s->cantxfg[i].data[0]); - priv->write(0, ®s->cantxfg[i].data[1]); - - /* put MB into rx queue */ - priv->write(FLEXCAN_MB_CNT_CODE(0x4), - ®s->cantxfg[i].can_ctrl); - } -#else for (i = FLEXCAN_TX_BUF_ID; i < ARRAY_SIZE(regs->cantxfg); i++) { priv->write(FLEXCAN_MB_CODE_RX_INACTIVE, ®s->cantxfg[i].can_ctrl); } -#endif -#ifdef CONFIG_CAN_FLEXCAN_ERRATA_ERR005829 /* Errata ERR005829: mark first TX mailbox as INACTIVE */ priv->write(FLEXCAN_MB_CODE_TX_INACTIVE, ®s->cantxfg[FLEXCAN_TX_BUF_RESERVED].can_ctrl); -#endif -#ifdef CONFIG_CAN_FLEXCAN_RX_FIFO_EN /* mark TX mailbox as INACTIVE */ priv->write(FLEXCAN_MB_CODE_TX_INACTIVE, ®s->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl); -#endif /* acceptance mask/acceptance code (accept everything) */ priv->write(0x0, ®s->rxgmask); priv->write(0x0, ®s->rx14mask); priv->write(0x0, ®s->rx15mask); -#ifdef CONFIG_CAN_FLEXCAN_RX_FIFO_EN if (priv->devtype_data->features & FLEXCAN_HAS_V10_FEATURES) priv->write(0x0, ®s->rxfgmask); -#else - priv->write(0x0, ®s->rxfgmask); -#endif /* * On Vybrid, disable memory error detection interrupts @@ -1157,8 +1117,13 @@ static int flexcan_chip_start(struct net_device *dev) priv->can.state = CAN_STATE_ERROR_ACTIVE; - /* enable FIFO interrupts */ - priv->write(FLEXCAN_IFLAG_DEFAULT, ®s->imask1); + if (priv->devtype_data->features & FLEXCAN_HAS_ONLY_LEGACY_RX_SUPPORT) + /* enable mb interrupts */ + priv->write(FLEXCAN_IFLAG_DEFAULT_RX_MB_MODE | + FLEXCAN_IFLAG_RX_MB_RXMASK, ®s->imask1); + else + /* enable FIFO interrupts */ + priv->write(FLEXCAN_IFLAG_DEFAULT, ®s->imask1); /* print chip status */ netdev_dbg(dev, "%s: reading mcr=0x%08x ctrl=0x%08x\n", __func__, @@ -1315,32 +1280,30 @@ static int register_flexcandev(struct net_device *dev) if (err) goto out_chip_disable; - /* set freeze, halt and activate FIFO, restrict register access */ + /* set freeze, halt and activate FIFO/legacy mode, restrict + * register access + */ reg = priv->read(®s->mcr); -#ifdef CONFIG_CAN_FLEXCAN_RX_FIFO_EN - reg |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_HALT | - FLEXCAN_MCR_FEN | FLEXCAN_MCR_SUPV; -#else + if (priv->devtype_data->features & FLEXCAN_HAS_ONLY_LEGACY_RX_SUPPORT) + reg &= ~FLEXCAN_MCR_FEN; + else + reg |= FLEXCAN_MCR_FEN; + reg |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_HALT | FLEXCAN_MCR_SUPV; -#endif priv->write(reg, ®s->mcr); - /* - * Currently we only support newer versions of this core - * featuring a RX FIFO. Older cores found on some Coldfire - * derivates are not yet supported. - */ - reg = priv->read(®s->mcr); -#ifdef CONFIG_CAN_FLEXCAN_RX_FIFO_EN - if (!(reg & FLEXCAN_MCR_FEN)) { - netdev_err(dev, "Could not enable RX FIFO, unsupported core\n"); - err = -ENODEV; - goto out_chip_disable; + if (priv->devtype_data->features & FLEXCAN_HAS_ONLY_LEGACY_RX_SUPPORT) { + /* Legacy RX mode*/ + netdev_info(dev, "Legacy mode (non RX-FIFO) enabled\n"); + } else { + /* RX FIFO mode */ + reg = priv->read(®s->mcr); + if (!(reg & FLEXCAN_MCR_FEN)) { + netdev_err(dev, "Could not enable RX FIFO, unsupported core\n"); + err = -ENODEV; + goto out_chip_disable; + } } -#else - if (!(reg & FLEXCAN_MCR_FEN)) - netdev_info(dev, "Legacy mode (non-RX FIFO) supported\n"); -#endif err = register_candev(dev); @@ -1365,6 +1328,8 @@ static const struct of_device_id flexcan_of_match[] = { { .compatible = "fsl,imx28-flexcan", .data = &fsl_imx28_devtype_data, }, { .compatible = "fsl,ls1021a-flexcan", .data = &fsl_ls1021a_devtype_data, }, + { .compatible = "fsl,ls1021ar2-flexcan", + .data = &fsl_ls1021a_r2_devtype_data, }, { .compatible = "fsl,p1010-flexcan", .data = &fsl_p1010_devtype_data, }, { .compatible = "fsl,vf610-flexcan", .data = &fsl_vf610_devtype_data, }, { /* sentinel */ }, @@ -1446,13 +1411,13 @@ static int flexcan_probe(struct platform_device *pdev) module_is_little = true; if ((core_is_little && module_is_little) || - (!core_is_little && !module_is_little)) { + (!core_is_little && !module_is_little)) { priv->read = flexcan_read_le; priv->write = flexcan_write_le; } if ((!core_is_little && module_is_little) || - (core_is_little && !module_is_little)) { + (core_is_little && !module_is_little)) { priv->read = flexcan_read_be; priv->write = flexcan_write_be; } diff --git a/drivers/net/ethernet/freescale/gianfar.h b/drivers/net/ethernet/freescale/gianfar.h index 262e896..0f5bf84 100644 --- a/drivers/net/ethernet/freescale/gianfar.h +++ b/drivers/net/ethernet/freescale/gianfar.h @@ -325,11 +325,7 @@ extern const char gfar_driver_version[]; #define RQUEUE_EN_ALL 0x000000FF /* Init to do tx snooping for buffers and descriptors */ -#ifdef CONFIG_SOC_LS1021A -#define DMACTRL_INIT_SETTINGS 0x00000003 -#else #define DMACTRL_INIT_SETTINGS 0x000000c3 -#endif #define DMACTRL_GRS 0x00000010 #define DMACTRL_GTS 0x00000008 #define DMACTRL_LE 0x00008000 @@ -496,12 +492,7 @@ extern const char gfar_driver_version[]; #define ATTR_BUFSTASH 0x00004000 #define ATTR_SNOOPING 0x000000c0 - -#ifdef CONFIG_SOC_LS1021A -#define ATTR_INIT_SETTINGS 0 -#else #define ATTR_INIT_SETTINGS ATTR_SNOOPING -#endif #define ATTRELI_INIT_SETTINGS 0x0 #define ATTRELI_EL_MASK 0x3fff0000 diff --git a/drivers/net/wan/fsl_ucc_hdlc.c b/drivers/net/wan/fsl_ucc_hdlc.c index e5c0db9..39cd38d 100644 --- a/drivers/net/wan/fsl_ucc_hdlc.c +++ b/drivers/net/wan/fsl_ucc_hdlc.c @@ -27,7 +27,6 @@ #include <linux/of_address.h> #include <linux/of_irq.h> #include <linux/of_platform.h> -#include <sysdev/fsl_soc.h> #include <linux/slab.h> #include "fsl_ucc_hdlc.h" @@ -135,27 +134,27 @@ static void dump_ucc(struct ucc_hdlc_private *priv) ucc_fast_dump_regs(priv->uccf); dev_info(priv->dev, "Dumping UCC %d Parameter RAM\n", priv->uh_info->uf_info.ucc_num); - dev_info(priv->dev, "rbase = 0x%x\n", in_be32(&ucc_pram->rbase)); - dev_info(priv->dev, "rbptr = 0x%x\n", in_be32(&ucc_pram->rbptr)); - dev_info(priv->dev, "mrblr = 0x%x\n", in_be16(&ucc_pram->mrblr)); - dev_info(priv->dev, "rbdlen = 0x%x\n", in_be16(&ucc_pram->rbdlen)); - dev_info(priv->dev, "rbdstat = 0x%x\n", in_be16(&ucc_pram->rbdstat)); - dev_info(priv->dev, "rstate = 0x%x\n", in_be32(&ucc_pram->rstate)); - dev_info(priv->dev, "rdptr = 0x%x\n", in_be32(&ucc_pram->rdptr)); - dev_info(priv->dev, "riptr = 0x%x\n", in_be16(&ucc_pram->riptr)); - dev_info(priv->dev, "tbase = 0x%x\n", in_be32(&ucc_pram->tbase)); - dev_info(priv->dev, "tbptr = 0x%x\n", in_be32(&ucc_pram->tbptr)); - dev_info(priv->dev, "tbdlen = 0x%x\n", in_be16(&ucc_pram->tbdlen)); - dev_info(priv->dev, "tbdstat = 0x%x\n", in_be16(&ucc_pram->tbdstat)); - dev_info(priv->dev, "tstate = 0x%x\n", in_be32(&ucc_pram->tstate)); - dev_info(priv->dev, "tdptr = 0x%x\n", in_be32(&ucc_pram->tdptr)); - dev_info(priv->dev, "tiptr = 0x%x\n", in_be16(&ucc_pram->tiptr)); - dev_info(priv->dev, "rcrc = 0x%x\n", in_be32(&ucc_pram->rcrc)); - dev_info(priv->dev, "tcrc = 0x%x\n", in_be32(&ucc_pram->tcrc)); - dev_info(priv->dev, "c_mask = 0x%x\n", in_be32(&ucc_pram->c_mask)); - dev_info(priv->dev, "c_pers = 0x%x\n", in_be32(&ucc_pram->c_pres)); - dev_info(priv->dev, "disfc = 0x%x\n", in_be16(&ucc_pram->disfc)); - dev_info(priv->dev, "crcec = 0x%x\n", in_be16(&ucc_pram->crcec)); + dev_info(priv->dev, "rbase = 0x%x\n", ioread32be(&ucc_pram->rbase)); + dev_info(priv->dev, "rbptr = 0x%x\n", ioread32be(&ucc_pram->rbptr)); + dev_info(priv->dev, "mrblr = 0x%x\n", ioread16be(&ucc_pram->mrblr)); + dev_info(priv->dev, "rbdlen = 0x%x\n", ioread16be(&ucc_pram->rbdlen)); + dev_info(priv->dev, "rbdstat = 0x%x\n", ioread16be(&ucc_pram->rbdstat)); + dev_info(priv->dev, "rstate = 0x%x\n", ioread32be(&ucc_pram->rstate)); + dev_info(priv->dev, "rdptr = 0x%x\n", ioread32be(&ucc_pram->rdptr)); + dev_info(priv->dev, "riptr = 0x%x\n", ioread16be(&ucc_pram->riptr)); + dev_info(priv->dev, "tbase = 0x%x\n", ioread32be(&ucc_pram->tbase)); + dev_info(priv->dev, "tbptr = 0x%x\n", ioread32be(&ucc_pram->tbptr)); + dev_info(priv->dev, "tbdlen = 0x%x\n", ioread16be(&ucc_pram->tbdlen)); + dev_info(priv->dev, "tbdstat = 0x%x\n", ioread16be(&ucc_pram->tbdstat)); + dev_info(priv->dev, "tstate = 0x%x\n", ioread32be(&ucc_pram->tstate)); + dev_info(priv->dev, "tdptr = 0x%x\n", ioread32be(&ucc_pram->tdptr)); + dev_info(priv->dev, "tiptr = 0x%x\n", ioread16be(&ucc_pram->tiptr)); + dev_info(priv->dev, "rcrc = 0x%x\n", ioread32be(&ucc_pram->rcrc)); + dev_info(priv->dev, "tcrc = 0x%x\n", ioread32be(&ucc_pram->tcrc)); + dev_info(priv->dev, "c_mask = 0x%x\n", ioread32be(&ucc_pram->c_mask)); + dev_info(priv->dev, "c_pers = 0x%x\n", ioread32be(&ucc_pram->c_pres)); + dev_info(priv->dev, "disfc = 0x%x\n", ioread16be(&ucc_pram->disfc)); + dev_info(priv->dev, "crcec = 0x%x\n", ioread16be(&ucc_pram->crcec)); } static void dump_bds(struct ucc_hdlc_private *priv) @@ -237,18 +236,18 @@ static void init_si(struct ucc_hdlc_private *priv) mask = 0x01 << i; if (priv->tx_ts_mask & mask) - out_be16(&siram[siram_entry_id * 32 + i], - siram_entry_valid); + iowrite16be(siram_entry_valid, + &siram[siram_entry_id * 32 + i]); else - out_be16(&siram[siram_entry_id * 32 + i], - siram_entry_closed); + iowrite16be(siram_entry_closed, + &siram[siram_entry_id * 32 + i]); if (priv->rx_ts_mask & mask) - out_be16(&siram[siram_entry_id * 32 + 0x200 + i], - siram_entry_valid); + iowrite16be(siram_entry_valid, + &siram[siram_entry_id * 32 + 0x200 + i]); else - out_be16(&siram[siram_entry_id * 32 + 0x200 + i], - siram_entry_closed); + iowrite16be(siram_entry_closed, + &siram[siram_entry_id * 32 + 0x200 + i]); } setbits16(&siram[(siram_entry_id * 32) + (priv->num_of_ts - 1)], @@ -282,16 +281,16 @@ static void init_si(struct ucc_hdlc_private *priv) switch (tdm_port) { case 0: - out_be16(&si_regs->sixmr1[0], sixmr); + iowrite16be(sixmr, &si_regs->sixmr1[0]); break; case 1: - out_be16(&si_regs->sixmr1[1], sixmr); + iowrite16be(sixmr, &si_regs->sixmr1[1]); break; case 2: - out_be16(&si_regs->sixmr1[2], sixmr); + iowrite16be(sixmr, &si_regs->sixmr1[2]); break; case 3: - out_be16(&si_regs->sixmr1[3], sixmr); + iowrite16be(sixmr, &si_regs->sixmr1[3]); break; default: dev_err(priv->dev, "can not find tdm sixmr reg\n"); @@ -336,10 +335,10 @@ static int uhdlc_init(struct ucc_hdlc_private *priv) /* Loopback mode */ if (priv->loopback) { - gumr = in_be32(&priv->uf_regs->gumr); + gumr = ioread32be(&priv->uf_regs->gumr); gumr |= (0x40000000 | UCC_FAST_GUMR_CDS | UCC_FAST_GUMR_TCI); gumr &= ~(UCC_FAST_GUMR_CTSP | UCC_FAST_GUMR_RSYN); - out_be32(&priv->uf_regs->gumr, gumr); + iowrite32be(gumr, &priv->uf_regs->gumr); } /* Initialize SI */ @@ -352,7 +351,7 @@ static int uhdlc_init(struct ucc_hdlc_private *priv) (u8) QE_CR_PROTOCOL_UNSPECIFIED, 0); /* Set UPSMR normal mode (need fixed)*/ - out_be32(&priv->uf_regs->upsmr, 0); + iowrite32be(0, &priv->uf_regs->upsmr); priv->rx_ring_size = RX_BD_RING_LEN; priv->tx_ring_size = TX_BD_RING_LEN; @@ -429,32 +428,32 @@ static int uhdlc_init(struct ucc_hdlc_private *priv) } /* Set RIPTR, TIPTR */ - out_be16(&priv->ucc_pram->riptr, (u16)riptr); - out_be16(&priv->ucc_pram->tiptr, (u16)tiptr); + iowrite16be((u16)riptr, &priv->ucc_pram->riptr); + iowrite16be((u16)tiptr, &priv->ucc_pram->tiptr); /* Set MRBLR */ - out_be16(&priv->ucc_pram->mrblr, (u16)MAX_RX_BUF_LENGTH); + iowrite16be((u16)MAX_RX_BUF_LENGTH, &priv->ucc_pram->mrblr); /* Set RBASE, TBASE */ - out_be32(&priv->ucc_pram->rbase, (u32)priv->dma_rx_bd); - out_be32(&priv->ucc_pram->tbase, (u32)priv->dma_tx_bd); + iowrite32be((u32)priv->dma_rx_bd, &priv->ucc_pram->rbase); + iowrite32be((u32)priv->dma_tx_bd, &priv->ucc_pram->tbase); /* Set RSTATE, TSTATE */ - out_be32(&priv->ucc_pram->rstate, 0x30000000); - out_be32(&priv->ucc_pram->tstate, 0x30000000); + iowrite32be(0x30000000, &priv->ucc_pram->rstate); + iowrite32be(0x30000000, &priv->ucc_pram->tstate); /* Set C_MASK, C_PRES for 16bit CRC */ - out_be32(&priv->ucc_pram->c_mask, 0x0000F0B8); - out_be32(&priv->ucc_pram->c_pres, 0x0000FFFF); - - out_be16(&priv->ucc_pram->mflr, MAX_RX_BUF_LENGTH + 8); - out_be16(&priv->ucc_pram->rfthr, 1); - out_be16(&priv->ucc_pram->rfcnt, 1); - out_be16(&priv->ucc_pram->hmask, DEFAULT_ADDR_MASK); - out_be16(&priv->ucc_pram->haddr2, DEFAULT_BROAD_ADDR); - out_be16(&priv->ucc_pram->haddr1, DEFAULT_HDLC_ADDR); - out_be16(&priv->ucc_pram->haddr3, DEFAULT_HDLC_ADDR); - out_be16(&priv->ucc_pram->haddr4, DEFAULT_HDLC_ADDR); + iowrite32be(0x0000F0B8, &priv->ucc_pram->c_mask); + iowrite32be(0x0000FFFF, &priv->ucc_pram->c_pres); + + iowrite16be(MAX_RX_BUF_LENGTH + 8, &priv->ucc_pram->mflr); + iowrite16be(1, &priv->ucc_pram->rfthr); + iowrite16be(1, &priv->ucc_pram->rfcnt); + iowrite16be(DEFAULT_ADDR_MASK, &priv->ucc_pram->hmask); + iowrite16be(DEFAULT_BROAD_ADDR, &priv->ucc_pram->haddr2); + iowrite16be(DEFAULT_HDLC_ADDR, &priv->ucc_pram->haddr1); + iowrite16be(DEFAULT_HDLC_ADDR, &priv->ucc_pram->haddr3); + iowrite16be(DEFAULT_HDLC_ADDR, &priv->ucc_pram->haddr4); /* Get BD buffer */ bd_buffer = dma_alloc_coherent(priv->dev, @@ -478,9 +477,9 @@ static int uhdlc_init(struct ucc_hdlc_private *priv) else bd_status = R_E | R_I | R_W; - out_be32((u32 *)(priv->rx_bd_base + i), bd_status); - out_be32(&priv->rx_bd_base[i].buf, priv->dma_rx_addr - + i * MAX_RX_BUF_LENGTH); + iowrite32be(bd_status, (u32 *)(priv->rx_bd_base + i)); + iowrite32be(priv->dma_rx_addr + i * MAX_RX_BUF_LENGTH, + &priv->rx_bd_base[i].buf); } for (i = 0; i < TX_BD_RING_LEN; i++) { @@ -489,7 +488,7 @@ static int uhdlc_init(struct ucc_hdlc_private *priv) else bd_status = T_I | T_TC | T_W; - out_be32((u32 *)(priv->tx_bd_base + i), bd_status); + iowrite32be(bd_status, (u32 *)(priv->tx_bd_base + i)); } return 0; @@ -532,7 +531,7 @@ static netdev_tx_t ucc_hdlc_tx(struct sk_buff *skb, struct net_device *dev) hdlc_head = (u32 *)skb->data; tmp_head = *hdlc_head; - tmp_head = (tmp_head & HDLC_HEAD_MASK) | DEFAULT_HDLC_HEAD; + tmp_head = (tmp_head & HDLC_HEAD_MASK) | cpu_to_be32(DEFAULT_HDLC_HEAD); *hdlc_head = tmp_head; dev->stats.tx_bytes += skb->len; @@ -547,7 +546,7 @@ static netdev_tx_t ucc_hdlc_tx(struct sk_buff *skb, struct net_device *dev) /* Start from the next BD that should be filled */ bd = priv->curtx_bd; - bd_status = in_be32((u32 __iomem *)bd); + bd_status = ioread32be((u32 __iomem *)bd); /* Save the skb pointer so we can free it later */ priv->tx_skbuff[priv->skb_curtx] = skb; @@ -556,14 +555,14 @@ static netdev_tx_t ucc_hdlc_tx(struct sk_buff *skb, struct net_device *dev) priv->skb_curtx = (priv->skb_curtx + 1) & TX_RING_MOD_MASK(TX_BD_RING_LEN); /* set up the buffer descriptor */ - out_be32(&((struct qe_bd __iomem *)bd)->buf, - dma_map_single(priv->dev, skb->data, - skb->len, DMA_TO_DEVICE)); + iowrite32be(dma_map_single(priv->dev, skb->data, skb->len, + DMA_TO_DEVICE), + &((struct qe_bd __iomem *)bd)->buf); bd_status = (bd_status & T_W) | T_R | T_I | T_L | T_TC | skb->len; /* set bd status and length */ - out_be32((u32 __iomem *)bd, bd_status); + iowrite32be(bd_status, (u32 __iomem *)bd); /* Move to next BD in the ring */ if (!(bd_status & T_W)) @@ -583,7 +582,7 @@ static int hdlc_tx_done(struct ucc_hdlc_private *priv) u32 bd_status; bd = priv->dirty_tx; - bd_status = in_be32((u32 __iomem *)bd); + bd_status = ioread32be((u32 __iomem *)bd); /* Normal processing. */ while ((bd_status & T_R) == 0) { @@ -599,7 +598,7 @@ static int hdlc_tx_done(struct ucc_hdlc_private *priv) dev->stats.tx_packets++; dma_unmap_single(priv->dev, - in_be32(&((struct qe_bd __iomem *)bd)->buf), + ioread32be(&((struct qe_bd __iomem *)bd)->buf), skb->len, DMA_TO_DEVICE); dev_kfree_skb_irq(skb); @@ -617,7 +616,7 @@ static int hdlc_tx_done(struct ucc_hdlc_private *priv) bd += 1; else bd = priv->tx_bd_base; - bd_status = in_be32((u32 __iomem *)bd); + bd_status = ioread32be((u32 __iomem *)bd); } priv->dirty_tx = bd; @@ -636,7 +635,7 @@ static int hdlc_rx_done(struct ucc_hdlc_private *priv, int rx_work_limit) int i; bd = priv->currx_bd; - bd_status = in_be32((u32 __iomem *)bd); + bd_status = ioread32be((u32 __iomem *)bd); /* while there are received buffers and BD is full (~R_E) */ while (!((bd_status & (R_E)) || (--rx_work_limit < 0))) { @@ -683,7 +682,7 @@ static int hdlc_rx_done(struct ucc_hdlc_private *priv, int rx_work_limit) else priv->currx_bdnum = RX_BD_RING_LEN - 1; - bd_status = in_be32((u32 __iomem *)bd); + bd_status = ioread32be((u32 __iomem *)bd); } priv->currx_bd = bd; @@ -701,8 +700,8 @@ static irqreturn_t ucc_hdlc_irq_handler(int irq, void *dev_id) uh_info = priv->uh_info; uccf = priv->uccf; - ucce = in_be32(uccf->p_ucce); - uccm = in_be32(uccf->p_uccm); + ucce = ioread32be(uccf->p_ucce); + uccm = ioread32be(uccf->p_uccm); if ((ucce >> 16) & (UCC_HDLC_UCCE_RXF | UCC_HDLC_UCCE_RXB)) hdlc_rx_done(priv, RX_CLEAN_MAX); @@ -710,7 +709,7 @@ static irqreturn_t ucc_hdlc_irq_handler(int irq, void *dev_id) if ((ucce >> 16) & UCC_HDLC_UCCE_TXB) hdlc_tx_done(priv); - out_be32(uccf->p_ucce, ucce); + iowrite32be(ucce, uccf->p_ucce); return IRQ_HANDLED; } @@ -886,6 +885,7 @@ static int of_parse_hdlc_tdm(struct device_node *np, const unsigned int *prop; const char *sprop; int ret = 0; + u32 val; sprop = of_get_property(np, "fsl,rx-sync-clock", NULL); if (sprop) { @@ -913,54 +913,54 @@ static int of_parse_hdlc_tdm(struct device_node *np, return -EINVAL; } - prop = of_get_property(np, "fsl,tx-timeslot", NULL); - if (!prop) { + ret = of_property_read_u32_index(np, "fsl,tx-timeslot", 0, &val); + if (ret) { ret = -EINVAL; dev_err(priv->dev, "Invalid tx-timeslot property\n"); return ret; } - priv->tx_ts_mask = *prop; + priv->tx_ts_mask = val; - prop = of_get_property(np, "fsl,rx-timeslot", NULL); - if (!prop) { + ret = of_property_read_u32_index(np, "fsl,rx-timeslot", 0, &val); + if (ret) { ret = -EINVAL; dev_err(priv->dev, "Invalid rx-timeslot property\n"); return ret; } - priv->rx_ts_mask = *prop; + priv->rx_ts_mask = val; - prop = of_get_property(np, "fsl,tdm-id", NULL); - if (!prop) { + ret = of_property_read_u32_index(np, "fsl,tdm-id", 0, &val); + if (ret) { ret = -EINVAL; dev_err(priv->dev, "No fsl,tdm-id property for this UCC\n"); return ret; } - priv->tdm_port = *prop; + priv->tdm_port = ret; uh_info->uf_info.tdm_num = priv->tdm_port; - prop = of_get_property(np, "fsl,tdm-mode", NULL); - if (!prop) { + sprop = of_get_property(np, "fsl,tdm-mode", NULL); + if (!sprop) { ret = -EINVAL; dev_err(priv->dev, "No tdm-mode property for UCC\n"); return ret; } - priv->tdm_mode = set_tdm_mode((const char *)prop); + priv->tdm_mode = set_tdm_mode(sprop); - prop = of_get_property(np, "fsl,tdm-framer-type", NULL); - if (!prop) { + sprop = of_get_property(np, "fsl,tdm-framer-type", NULL); + if (!sprop) { ret = -EINVAL; dev_err(priv->dev, "No tdm-framer-type property for UCC\n"); return ret; } - priv->tdm_framer_type = set_tdm_framer((const char *)prop); + priv->tdm_framer_type = set_tdm_framer(sprop); - prop = of_get_property(np, "fsl,siram-entry-id", NULL); - if (!prop) { + ret = of_property_read_u32_index(np, "fsl,siram-entry-id", 0, &val); + if (ret) { ret = -EINVAL; dev_err(priv->dev, "No siram entry id for UCC\n"); return ret; } - priv->siram_entry_id = *(const u32 *)prop; + priv->siram_entry_id = val; set_si_param(priv); @@ -993,11 +993,11 @@ static void store_clk_config(struct ucc_hdlc_private *priv) struct qe_mux *qe_mux_reg = &qe_immr->qmx; /* store si clk */ - priv->cmxsi1cr_h = in_be32(&qe_mux_reg->cmxsi1cr_h); - priv->cmxsi1cr_l = in_be32(&qe_mux_reg->cmxsi1cr_l); + priv->cmxsi1cr_h = ioread32be(&qe_mux_reg->cmxsi1cr_h); + priv->cmxsi1cr_l = ioread32be(&qe_mux_reg->cmxsi1cr_l); /* store si sync */ - priv->cmxsi1syr = in_be32(&qe_mux_reg->cmxsi1syr); + priv->cmxsi1syr = ioread32be(&qe_mux_reg->cmxsi1syr); /* store ucc clk */ memcpy_fromio(priv->cmxucr, qe_mux_reg->cmxucr, 4 * sizeof(u32)); @@ -1009,10 +1009,10 @@ static void resume_clk_config(struct ucc_hdlc_private *priv) memcpy_toio(qe_mux_reg->cmxucr, priv->cmxucr, 4 * sizeof(u32)); - out_be32(&qe_mux_reg->cmxsi1cr_h, priv->cmxsi1cr_h); - out_be32(&qe_mux_reg->cmxsi1cr_l, priv->cmxsi1cr_l); + iowrite32be(priv->cmxsi1cr_h, &qe_mux_reg->cmxsi1cr_h); + iowrite32be(priv->cmxsi1cr_l, &qe_mux_reg->cmxsi1cr_l); - out_be32(&qe_mux_reg->cmxsi1syr, priv->cmxsi1syr); + iowrite32be(priv->cmxsi1syr, &qe_mux_reg->cmxsi1syr); } @@ -1029,8 +1029,8 @@ static int uhdlc_suspend(struct device *dev) uf_regs = priv->uf_regs; /* backup gumr guemr*/ - priv->gumr = in_be32(&uf_regs->gumr); - priv->guemr = in_8(&uf_regs->guemr); + priv->gumr = ioread32be(&uf_regs->gumr); + priv->guemr = ioread8(&uf_regs->guemr); priv->ucc_pram_bak = kmalloc(sizeof(struct ucc_hdlc_param), GFP_KERNEL); @@ -1070,25 +1070,25 @@ static int uhdlc_resume(struct device *dev) uccf = priv->uccf; /* restore gumr guemr */ - out_8(&uf_regs->guemr, priv->guemr); - out_be32(&uf_regs->gumr, priv->gumr); + iowrite8(priv->guemr, &uf_regs->guemr); + iowrite32be(priv->gumr, &uf_regs->gumr); /* Set Virtual Fifo registers */ - out_be16(&uf_regs->urfs, uf_info->urfs); - out_be16(&uf_regs->urfet, uf_info->urfet); - out_be16(&uf_regs->urfset, uf_info->urfset); - out_be16(&uf_regs->utfs, uf_info->utfs); - out_be16(&uf_regs->utfet, uf_info->utfet); - out_be16(&uf_regs->utftt, uf_info->utftt); + iowrite16be(uf_info->urfs, &uf_regs->urfs); + iowrite16be(uf_info->urfet, &uf_regs->urfet); + iowrite16be(uf_info->urfset, &uf_regs->urfset); + iowrite16be(uf_info->utfs, &uf_regs->utfs); + iowrite16be(uf_info->utfet, &uf_regs->utfet); + iowrite16be(uf_info->utftt, &uf_regs->utftt); /* utfb, urfb are offsets from MURAM base */ - out_be32(&uf_regs->utfb, uccf->ucc_fast_tx_virtual_fifo_base_offset); - out_be32(&uf_regs->urfb, uccf->ucc_fast_rx_virtual_fifo_base_offset); + iowrite32be(uccf->ucc_fast_tx_virtual_fifo_base_offset, &uf_regs->utfb); + iowrite32be(uccf->ucc_fast_rx_virtual_fifo_base_offset, &uf_regs->urfb); /* Rx Tx and sync clock routing */ resume_clk_config(priv); - out_be32(&uf_regs->uccm, uf_info->uccm_mask); - out_be32(&uf_regs->ucce, 0xffffffff); + iowrite32be(uf_info->uccm_mask, &uf_regs->uccm); + iowrite32be(0xffffffff, &uf_regs->ucce); ucc_fast_disable(priv->uccf, COMM_DIR_RX | COMM_DIR_TX); @@ -1102,7 +1102,7 @@ static int uhdlc_resume(struct device *dev) (u8)QE_CR_PROTOCOL_UNSPECIFIED, 0); /* Set UPSMR normal mode */ - out_be32(&uf_regs->upsmr, 0); + iowrite32be(0, &uf_regs->upsmr); /* init parameter base */ cecr_subblock = ucc_fast_get_qe_cr_subblock(uf_info->ucc_num); @@ -1124,9 +1124,9 @@ static int uhdlc_resume(struct device *dev) else bd_status = R_E | R_I | R_W; - out_be32((u32 *)(priv->rx_bd_base + i), bd_status); - out_be32(&priv->rx_bd_base[i].buf, priv->dma_rx_addr - + i * MAX_RX_BUF_LENGTH); + iowrite32be(bd_status, (u32 *)(priv->rx_bd_base + i)); + iowrite32be(priv->dma_rx_addr + i * MAX_RX_BUF_LENGTH, + &priv->rx_bd_base[i].buf); } for (i = 0; i < TX_BD_RING_LEN; i++) { @@ -1135,7 +1135,7 @@ static int uhdlc_resume(struct device *dev) else bd_status = T_I | T_TC | T_W; - out_be32((u32 *)(priv->tx_bd_base + i), bd_status); + iowrite32be(bd_status, (u32 *)(priv->tx_bd_base + i)); } /* if hdlc is busy enable TX and RX */ @@ -1191,14 +1191,15 @@ static int ucc_hdlc_probe(struct platform_device *pdev) const unsigned int *prop; const char *sprop; int ret; + u32 val; - prop = of_get_property(np, "cell-index", NULL); - if (!prop) { + ret = of_property_read_u32_index(np, "cell-index", 0, &val); + if (ret) { dev_err(&pdev->dev, "Invalid ucc property\n"); return -ENODEV; } - ucc_num = *prop - 1; + ucc_num = val - 1; if ((ucc_num > 3) || (ucc_num < 0)) { dev_err(&pdev->dev, ": Invalid UCC num\n"); return -EINVAL; diff --git a/drivers/pci/host/pci-layerscape.c b/drivers/pci/host/pci-layerscape.c index e3cceb6..c5633cf 100644 --- a/drivers/pci/host/pci-layerscape.c +++ b/drivers/pci/host/pci-layerscape.c @@ -37,8 +37,8 @@ #define SCFG_SPIMSICR 0x40 #define SCFG_SPIMSICLRCR 0x90 -#define MSI_LS1021A_ADDR 0x1570040 -#define MSI_LS1021A_DATA(pex_idx) (0xb3 + pex_idx) +#define LS1021A_MSIIR_ADDR(idx) (0x1570e00 + (idx) * 8) +#define LS1021A_MSIR_OFF(idx) (0x0e04 + (idx) * 8) /* Symbol Timer Register and Filter Mask Register 1 */ #define PCIE_STRFMR1 0x71c @@ -72,43 +72,53 @@ static int ls_pcie_link_up(struct pcie_port *pp) static u32 ls_pcie_get_msi_addr(struct pcie_port *pp) { - return MSI_LS1021A_ADDR; + struct ls_pcie *pcie = to_ls_pcie(pp); + + return LS1021A_MSIIR_ADDR(pcie->index); } static u32 ls_pcie_get_msi_data(struct pcie_port *pp, int pos) { - struct ls_pcie *pcie = to_ls_pcie(pp); - - return MSI_LS1021A_DATA(pcie->index); + return pos * 8; } static irqreturn_t ls_pcie_msi_irq_handler(int irq, void *data) { struct pcie_port *pp = data; struct ls_pcie *pcie = to_ls_pcie(pp); - unsigned int msi_irq; - - /* clear the interrupt */ - regmap_write(pcie->scfg, SCFG_SPIMSICLRCR, - cpu_to_be32(MSI_LS1021A_DATA(pcie->index))); - - msi_irq = irq_find_mapping(pp->irq_domain, 0); - if (!msi_irq) { - /* - * that's weird who triggered this? - * just clear it - */ - dev_err(pcie->dev, "unexpected MSI\n"); - return IRQ_NONE; + unsigned long val; + int msi_irq, ret, pos; + + regmap_read(pcie->scfg, LS1021A_MSIR_OFF(pcie->index), (u32 *) &val); + + if (val) { + ret = IRQ_HANDLED; + pos = 0; + while ((pos = find_next_bit(&val, 32, pos)) != 32) { + msi_irq = irq_find_mapping(pp->irq_domain, 31 - pos); + if (!msi_irq) { + /* + * that's weird who triggered this? + * just clear it + */ + dev_err(pcie->dev, "unexpected MSI\n"); + ret = IRQ_NONE; + continue; + } + + #if defined(CONFIG_PREEMPT_RT_FULL) || defined(CONFIG_PREEMPT_RTB) + local_irq_disable(); + #endif + generic_handle_irq(msi_irq); + #if defined(CONFIG_PREEMPT_RT_FULL) || defined(CONFIG_PREEMPT_RTB) + local_irq_enable(); + #endif + ret = IRQ_HANDLED; + pos++; + } } -#if defined(CONFIG_PREEMPT_RT_FULL) || defined(CONFIG_PREEMPT_RTB) - local_irq_disable(); -#endif - generic_handle_irq(msi_irq); -#if defined(CONFIG_PREEMPT_RT_FULL) || defined(CONFIG_PREEMPT_RTB) - local_irq_enable(); -#endif - return IRQ_HANDLED; + + return ret; } static void ls_pcie_msi_clear_irq(struct pcie_port *pp, int irq) @@ -119,18 +129,6 @@ static void ls_pcie_msi_set_irq(struct pcie_port *pp, int irq) { } -static void ls1021a_pcie_msi_fixup(struct pcie_port *pp) -{ - int i; - - /* - * LS1021A has only one MSI interrupt - * Set all msi interrupts as used except the first one - */ - for (i = 1; i < MAX_MSI_IRQS; i++) - set_bit(i, pp->msi_irq_in_use); -} - static void ls_pcie_host_init(struct pcie_port *pp) { struct ls_pcie *pcie = to_ls_pcie(pp); @@ -156,8 +154,6 @@ static void ls_pcie_host_init(struct pcie_port *pp) val = ioread32(pcie->dbi + PCIE_STRFMR1); val &= 0xffff; iowrite32(val, pcie->dbi + PCIE_STRFMR1); - - ls1021a_pcie_msi_fixup(pp); } } diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h index 91bb4c9..1539790 100644 --- a/include/linux/mmc/sdhci.h +++ b/include/linux/mmc/sdhci.h @@ -185,6 +185,9 @@ struct sdhci_host { unsigned int ocr_avail_mmc; u32 ocr_mask; /* available voltages */ + /* cached registers */ + u32 ier; + wait_queue_head_t buf_ready_int; /* Waitqueue for Buffer Read Ready interrupt */ unsigned int tuning_done; /* Condition flag set when CMD19 succeeds */ diff --git a/include/sound/pcm.h b/include/sound/pcm.h index a07b670..84b10f9 100644 --- a/include/sound/pcm.h +++ b/include/sound/pcm.h @@ -418,8 +418,6 @@ struct snd_pcm_substream { #endif /* misc flags */ unsigned int hw_opened: 1; - /* data swapped flags */ - unsigned int data_swapped; }; #define SUBSTREAM_BUSY(substream) ((substream)->ref_count > 0) diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c index 6dd3089..e1ef106 100644 --- a/sound/core/pcm_lib.c +++ b/sound/core/pcm_lib.c @@ -1964,9 +1964,6 @@ static int snd_pcm_lib_write_transfer(struct snd_pcm_substream *substream, struct snd_pcm_runtime *runtime = substream->runtime; int err; char __user *buf = (char __user *) data + frames_to_bytes(runtime, off); - int i; - char tmp; - if (substream->ops->copy) { if ((err = substream->ops->copy(substream, -1, hwoff, buf, frames)) < 0) return err; @@ -1974,22 +1971,6 @@ static int snd_pcm_lib_write_transfer(struct snd_pcm_substream *substream, char *hwbuf = runtime->dma_area + frames_to_bytes(runtime, hwoff); if (copy_from_user(hwbuf, buf, frames_to_bytes(runtime, frames))) return -EFAULT; - - if (substream->data_swapped) { - switch (runtime->format) { - case SNDRV_PCM_FORMAT_S16_LE: - for (i = 0; - i < frames_to_bytes(runtime, frames); - i = i + 2) { - tmp = *(hwbuf + i); - *(hwbuf + i) = *(hwbuf + i + 1); - *(hwbuf + i + 1) = tmp; - } - break; - default: - return -EINVAL; - } - } } return 0; } @@ -2205,30 +2186,11 @@ static int snd_pcm_lib_read_transfer(struct snd_pcm_substream *substream, struct snd_pcm_runtime *runtime = substream->runtime; int err; char __user *buf = (char __user *) data + frames_to_bytes(runtime, off); - int i; - char tmp; - if (substream->ops->copy) { if ((err = substream->ops->copy(substream, -1, hwoff, buf, frames)) < 0) return err; } else { char *hwbuf = runtime->dma_area + frames_to_bytes(runtime, hwoff); - if (substream->data_swapped) { - switch (runtime->format) { - case SNDRV_PCM_FORMAT_S16_LE: - for (i = 0; - i < frames_to_bytes(runtime, frames); - i = i + 2) { - tmp = *(hwbuf + i); - *(hwbuf + i) = *(hwbuf + i + 1); - *(hwbuf + i + 1) = tmp; - } - break; - default: - return -EINVAL; - } - } - if (copy_to_user(buf, hwbuf, frames_to_bytes(runtime, frames))) return -EFAULT; } diff --git a/sound/soc/fsl/fsl_sai.c b/sound/soc/fsl/fsl_sai.c index 3653b25..896f011 100644 --- a/sound/soc/fsl/fsl_sai.c +++ b/sound/soc/fsl/fsl_sai.c @@ -334,9 +334,6 @@ static int fsl_sai_startup(struct snd_pcm_substream *substream, struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai); u32 reg; - if (sai->big_endian_regs) - substream->data_swapped = 1; - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) reg = FSL_SAI_TCR3; else @@ -555,14 +552,8 @@ static int fsl_sai_probe(struct platform_device *pdev) return PTR_ERR(sai->regmap); } - if (sai->big_endian_regs) { - sai->dma_params_rx.addr = res->start + FSL_SAI_RDR + 2; - sai->dma_params_tx.addr = res->start + FSL_SAI_TDR + 2; - } else { - sai->dma_params_rx.addr = res->start + FSL_SAI_RDR; - sai->dma_params_tx.addr = res->start + FSL_SAI_TDR; - } - + sai->dma_params_rx.addr = res->start + FSL_SAI_RDR; + sai->dma_params_tx.addr = res->start + FSL_SAI_TDR; sai->dma_params_rx.maxburst = FSL_SAI_MAXBURST_RX; sai->dma_params_tx.maxburst = FSL_SAI_MAXBURST_TX; |