Merge remote-tracking branch 'agust/next' into next
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Wed, 20 Feb 2013 00:39:05 +0000 (11:39 +1100)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Wed, 20 Feb 2013 00:39:05 +0000 (11:39 +1100)
<<
Please pull mpc5xxx patches for v3.9. The bestcomm driver is
moved to drivers/dma (so it will be usable for ColdFire).
mpc5121 now provides common dtsi file and existing mpc5121 device
trees use it. There are some minor clock init and sparse fixes
and updates for various 5200 device tree files from Grant. Some
fixes for bugs in the mpc5121 DIU driver are also included here
(Andrew Morton suggested to push them via my mpc5xxx tree).
>>

66 files changed:
arch/powerpc/boot/dts/a3m071.dts
arch/powerpc/boot/dts/a4m072.dts
arch/powerpc/boot/dts/cm5200.dts
arch/powerpc/boot/dts/digsy_mtc.dts
arch/powerpc/boot/dts/lite5200b.dts
arch/powerpc/boot/dts/media5200.dts
arch/powerpc/boot/dts/motionpro.dts
arch/powerpc/boot/dts/mpc5121.dtsi [new file with mode: 0644]
arch/powerpc/boot/dts/mpc5121ads.dts
arch/powerpc/boot/dts/mpc5200b.dtsi
arch/powerpc/boot/dts/mucmc52.dts
arch/powerpc/boot/dts/o2d.dtsi
arch/powerpc/boot/dts/pcm030.dts
arch/powerpc/boot/dts/pcm032.dts
arch/powerpc/boot/dts/pdm360ng.dts
arch/powerpc/boot/dts/uc101.dts
arch/powerpc/include/asm/mpc5121.h
arch/powerpc/platforms/512x/clock.c
arch/powerpc/platforms/512x/mpc512x_shared.c
arch/powerpc/platforms/52xx/mpc52xx_lpbfifo.c
arch/powerpc/platforms/Kconfig
arch/powerpc/sysdev/Makefile
arch/powerpc/sysdev/bestcomm/Kconfig [deleted file]
arch/powerpc/sysdev/bestcomm/Makefile [deleted file]
arch/powerpc/sysdev/bestcomm/ata.c [deleted file]
arch/powerpc/sysdev/bestcomm/ata.h [deleted file]
arch/powerpc/sysdev/bestcomm/bcom_ata_task.c [deleted file]
arch/powerpc/sysdev/bestcomm/bcom_fec_rx_task.c [deleted file]
arch/powerpc/sysdev/bestcomm/bcom_fec_tx_task.c [deleted file]
arch/powerpc/sysdev/bestcomm/bcom_gen_bd_rx_task.c [deleted file]
arch/powerpc/sysdev/bestcomm/bcom_gen_bd_tx_task.c [deleted file]
arch/powerpc/sysdev/bestcomm/bestcomm.c [deleted file]
arch/powerpc/sysdev/bestcomm/bestcomm.h [deleted file]
arch/powerpc/sysdev/bestcomm/bestcomm_priv.h [deleted file]
arch/powerpc/sysdev/bestcomm/fec.c [deleted file]
arch/powerpc/sysdev/bestcomm/fec.h [deleted file]
arch/powerpc/sysdev/bestcomm/gen_bd.c [deleted file]
arch/powerpc/sysdev/bestcomm/gen_bd.h [deleted file]
arch/powerpc/sysdev/bestcomm/sram.c [deleted file]
arch/powerpc/sysdev/bestcomm/sram.h [deleted file]
arch/powerpc/sysdev/mpc5xxx_clocks.c
drivers/Makefile
drivers/ata/pata_mpc52xx.c
drivers/dma/Kconfig
drivers/dma/Makefile
drivers/dma/bestcomm/Kconfig [new file with mode: 0644]
drivers/dma/bestcomm/Makefile [new file with mode: 0644]
drivers/dma/bestcomm/ata.c [new file with mode: 0644]
drivers/dma/bestcomm/bcom_ata_task.c [new file with mode: 0644]
drivers/dma/bestcomm/bcom_fec_rx_task.c [new file with mode: 0644]
drivers/dma/bestcomm/bcom_fec_tx_task.c [new file with mode: 0644]
drivers/dma/bestcomm/bcom_gen_bd_rx_task.c [new file with mode: 0644]
drivers/dma/bestcomm/bcom_gen_bd_tx_task.c [new file with mode: 0644]
drivers/dma/bestcomm/bestcomm.c [new file with mode: 0644]
drivers/dma/bestcomm/fec.c [new file with mode: 0644]
drivers/dma/bestcomm/gen_bd.c [new file with mode: 0644]
drivers/dma/bestcomm/sram.c [new file with mode: 0644]
drivers/net/ethernet/freescale/fec_mpc52xx.c
drivers/video/fsl-diu-fb.c
include/linux/fsl/bestcomm/ata.h [new file with mode: 0644]
include/linux/fsl/bestcomm/bestcomm.h [new file with mode: 0644]
include/linux/fsl/bestcomm/bestcomm_priv.h [new file with mode: 0644]
include/linux/fsl/bestcomm/fec.h [new file with mode: 0644]
include/linux/fsl/bestcomm/gen_bd.h [new file with mode: 0644]
include/linux/fsl/bestcomm/sram.h [new file with mode: 0644]
sound/soc/fsl/mpc5200_dma.c

index 877a28cb77e458718235fb4b28740c500526a411..bf81b8f9704c9c8a094e78ab8c296758a0eab366 100644 (file)
@@ -17,6 +17,8 @@
 
 /include/ "mpc5200b.dtsi"
 
+&gpt0 { fsl,has-wdt; };
+
 / {
        model = "anonymous,a3m071";
        compatible = "anonymous,a3m071";
                bus-frequency = <0>; /* From boot loader */
                system-frequency = <0>; /* From boot loader */
 
-               timer@600 {
-                       fsl,has-wdt;
-               };
-
                spi@f00 {
                        status = "disabled";
                };
index fabe7b7d5f139f99306ba726338dae55a2d90f53..1f02034c7e99a848713a23ea612be0d7736411d3 100644 (file)
 
 /include/ "mpc5200b.dtsi"
 
+&gpt0 { fsl,has-wdt; };
+&gpt3 { gpio-controller; };
+&gpt4 { gpio-controller; };
+&gpt5 { gpio-controller; };
+
 / {
        model = "anonymous,a4m072";
        compatible = "anonymous,a4m072";
                        fsl,init-fd-counters = <0x3333>;
                };
 
-               timer@600 {
-                       fsl,has-wdt;
-               };
-
-               gpt3: timer@630 { /* General Purpose Timer in GPIO mode */
-                       compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio";
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
-               gpt4: timer@640 { /* General Purpose Timer in GPIO mode */
-                       compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio";
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
-               gpt5: timer@650 { /* General Purpose Timer in GPIO mode */
-                       compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio";
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
                spi@f00 {
                        status = "disabled";
                };
index ad3a4f4a2b048bbe7efdfa91f2783d9468df005c..fb580dd84ddf6a7ecc82dd10a2f453e441a06867 100644 (file)
 
 /include/ "mpc5200b.dtsi"
 
+&gpt0 { fsl,has-wdt; };
+
 / {
        model = "schindler,cm5200";
        compatible = "schindler,cm5200";
 
        soc5200@f0000000 {
-               timer@600 {     // General Purpose Timer
-                       fsl,has-wdt;
-               };
-
                can@900 {
                        status = "disabled";
                };
index a7511f2d844d9155a1c193effc52f34cd081f46f..955bff629df3c3c2057dd42eedb8f1cc0ff605f5 100644 (file)
@@ -13,6 +13,9 @@
 
 /include/ "mpc5200b.dtsi"
 
+&gpt0 { gpio-controller; fsl,has-wdt; };
+&gpt1 { gpio-controller; };
+
 / {
        model = "intercontrol,digsy-mtc";
        compatible = "intercontrol,digsy-mtc";
        };
 
        soc5200@f0000000 {
-               timer@600 {     // General Purpose Timer
-                       #gpio-cells = <2>;
-                       fsl,has-wdt;
-                       gpio-controller;
-               };
-
-               timer@610 {
-                       #gpio-cells = <2>;
-                       gpio-controller;
-               };
-
                rtc@800 {
                        status = "disabled";
                };
index fb288bb882b6d7f4111c19b5f69b79c390382e05..5abb46c5cc9513e60a37a643b3519db5bc6ccfe4 100644 (file)
 
 /include/ "mpc5200b.dtsi"
 
+&gpt0 { fsl,has-wdt; };
+&gpt2 { gpio-controller; };
+&gpt3 { gpio-controller; };
+
 / {
        model = "fsl,lite5200b";
        compatible = "fsl,lite5200b";
 
+       leds {
+               compatible = "gpio-leds";
+               tmr2 {
+                       gpios = <&gpt2 0 1>;
+               };
+               tmr3 {
+                       gpios = <&gpt3 0 1>;
+                       linux,default-trigger = "heartbeat";
+               };
+               led1 { gpios = <&gpio_wkup 2 1>; };
+               led2 { gpios = <&gpio_simple 3 1>; };
+               led3 { gpios = <&gpio_wkup 3 1>; };
+               led4 { gpios = <&gpio_simple 2 1>; };
+       };
+
        memory {
                reg = <0x00000000 0x10000000>;  // 256MB
        };
 
        soc5200@f0000000 {
-               timer@600 {     // General Purpose Timer
-                       fsl,has-wdt;
-               };
-
                psc@2000 {              // PSC1
                        compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart";
                        cell-index = <0>;
index 48d72f38e5edd79daf2650cf21b67e3275b408f0..b5413cb85f13458f31a46019a5b868c12082f192 100644 (file)
@@ -13,6 +13,8 @@
 
 /include/ "mpc5200b.dtsi"
 
+&gpt0 { fsl,has-wdt; };
+
 / {
        model = "fsl,media5200";
        compatible = "fsl,media5200";
        soc5200@f0000000 {
                bus-frequency = <132000000>;// 132 MHz
 
-               timer@600 {     // General Purpose Timer
-                       fsl,has-wdt;
-               };
-
                psc@2000 {      // PSC1
                        status = "disabled";
                };
index 0b78e89ac69bedf2a9d7462ba22e47ba21a0e01d..bbabd97492ad3096013760507484c3744b1789c8 100644 (file)
 
 /include/ "mpc5200b.dtsi"
 
+&gpt0 { fsl,has-wdt; };
+&gpt6 { // Motion-PRO status LED
+       compatible = "promess,motionpro-led";
+       label = "motionpro-statusled";
+       blink-delay = <100>; // 100 msec
+};
+&gpt7 { // Motion-PRO ready LED
+       compatible = "promess,motionpro-led";
+       label = "motionpro-readyled";
+};
+
 / {
        model = "promess,motionpro";
        compatible = "promess,motionpro";
 
        soc5200@f0000000 {
-               timer@600 {     // General Purpose Timer
-                       fsl,has-wdt;
-               };
-
-               timer@660 {     // Motion-PRO status LED
-                       compatible = "promess,motionpro-led";
-                       label = "motionpro-statusled";
-                       blink-delay = <100>; // 100 msec
-               };
-
-               timer@670 {     // Motion-PRO ready LED
-                       compatible = "promess,motionpro-led";
-                       label = "motionpro-readyled";
-               };
-
                can@900 {
                        status = "disabled";
                };
diff --git a/arch/powerpc/boot/dts/mpc5121.dtsi b/arch/powerpc/boot/dts/mpc5121.dtsi
new file mode 100644 (file)
index 0000000..723e292
--- /dev/null
@@ -0,0 +1,410 @@
+/*
+ * base MPC5121 Device Tree Source
+ *
+ * Copyright 2007-2008 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 the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+
+/dts-v1/;
+
+/ {
+       model = "mpc5121";
+       compatible = "fsl,mpc5121";
+       #address-cells = <1>;
+       #size-cells = <1>;
+        interrupt-parent = <&ipic>;
+
+       aliases {
+               ethernet0 = &eth0;
+               pci = &pci;
+       };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               PowerPC,5121@0 {
+                       device_type = "cpu";
+                       reg = <0>;
+                       d-cache-line-size = <0x20>;     /* 32 bytes */
+                       i-cache-line-size = <0x20>;     /* 32 bytes */
+                       d-cache-size = <0x8000>;        /* L1, 32K */
+                       i-cache-size = <0x8000>;        /* L1, 32K */
+                       timebase-frequency = <49500000>;/* 49.5 MHz (csb/4) */
+                       bus-frequency = <198000000>;    /* 198 MHz csb bus */
+                       clock-frequency = <396000000>;  /* 396 MHz ppc core */
+               };
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0x00000000 0x10000000>;  /* 256MB at 0 */
+       };
+
+       mbx@20000000 {
+               compatible = "fsl,mpc5121-mbx";
+               reg = <0x20000000 0x4000>;
+               interrupts = <66 0x8>;
+       };
+
+       sram@30000000 {
+               compatible = "fsl,mpc5121-sram";
+               reg = <0x30000000 0x20000>;     /* 128K at 0x30000000 */
+       };
+
+       nfc@40000000 {
+               compatible = "fsl,mpc5121-nfc";
+               reg = <0x40000000 0x100000>;    /* 1M at 0x40000000 */
+               interrupts = <6 8>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+       };
+
+       localbus@80000020 {
+               compatible = "fsl,mpc5121-localbus";
+               #address-cells = <2>;
+               #size-cells = <1>;
+               reg = <0x80000020 0x40>;
+               interrupts = <7 0x8>;
+               ranges = <0x0 0x0 0xfc000000 0x04000000>;
+       };
+
+       soc@80000000 {
+               compatible = "fsl,mpc5121-immr";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               #interrupt-cells = <2>;
+               ranges = <0x0 0x80000000 0x400000>;
+               reg = <0x80000000 0x400000>;
+               bus-frequency = <66000000>;     /* 66 MHz ips bus */
+
+
+               /*
+                * IPIC
+                * interrupts cell = <intr #, sense>
+                * sense values match linux IORESOURCE_IRQ_* defines:
+                * sense == 8: Level, low assertion
+                * sense == 2: Edge, high-to-low change
+                */
+               ipic: interrupt-controller@c00 {
+                       compatible = "fsl,mpc5121-ipic", "fsl,ipic";
+                       interrupt-controller;
+                       #address-cells = <0>;
+                       #interrupt-cells = <2>;
+                       reg = <0xc00 0x100>;
+               };
+
+               /* Watchdog timer */
+               wdt@900 {
+                       compatible = "fsl,mpc5121-wdt";
+                       reg = <0x900 0x100>;
+               };
+
+               /* Real time clock */
+               rtc@a00 {
+                       compatible = "fsl,mpc5121-rtc";
+                       reg = <0xa00 0x100>;
+                       interrupts = <79 0x8 80 0x8>;
+               };
+
+               /* Reset module */
+               reset@e00 {
+                       compatible = "fsl,mpc5121-reset";
+                       reg = <0xe00 0x100>;
+               };
+
+               /* Clock control */
+               clock@f00 {
+                       compatible = "fsl,mpc5121-clock";
+                       reg = <0xf00 0x100>;
+               };
+
+               /* Power Management Controller */
+               pmc@1000{
+                       compatible = "fsl,mpc5121-pmc";
+                       reg = <0x1000 0x100>;
+                       interrupts = <83 0x8>;
+               };
+
+               gpio@1100 {
+                       compatible = "fsl,mpc5121-gpio";
+                       reg = <0x1100 0x100>;
+                       interrupts = <78 0x8>;
+               };
+
+               can@1300 {
+                       compatible = "fsl,mpc5121-mscan";
+                       reg = <0x1300 0x80>;
+                       interrupts = <12 0x8>;
+               };
+
+               can@1380 {
+                       compatible = "fsl,mpc5121-mscan";
+                       reg = <0x1380 0x80>;
+                       interrupts = <13 0x8>;
+               };
+
+               sdhc@1500 {
+                       compatible = "fsl,mpc5121-sdhc";
+                       reg = <0x1500 0x100>;
+                       interrupts = <8 0x8>;
+               };
+
+               i2c@1700 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "fsl,mpc5121-i2c", "fsl-i2c";
+                       reg = <0x1700 0x20>;
+                       interrupts = <9 0x8>;
+               };
+
+               i2c@1720 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "fsl,mpc5121-i2c", "fsl-i2c";
+                       reg = <0x1720 0x20>;
+                       interrupts = <10 0x8>;
+               };
+
+               i2c@1740 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "fsl,mpc5121-i2c", "fsl-i2c";
+                       reg = <0x1740 0x20>;
+                       interrupts = <11 0x8>;
+               };
+
+               i2ccontrol@1760 {
+                       compatible = "fsl,mpc5121-i2c-ctrl";
+                       reg = <0x1760 0x8>;
+               };
+
+               axe@2000 {
+                       compatible = "fsl,mpc5121-axe";
+                       reg = <0x2000 0x100>;
+                       interrupts = <42 0x8>;
+               };
+
+               display@2100 {
+                       compatible = "fsl,mpc5121-diu";
+                       reg = <0x2100 0x100>;
+                       interrupts = <64 0x8>;
+               };
+
+               can@2300 {
+                       compatible = "fsl,mpc5121-mscan";
+                       reg = <0x2300 0x80>;
+                       interrupts = <90 0x8>;
+               };
+
+               can@2380 {
+                       compatible = "fsl,mpc5121-mscan";
+                       reg = <0x2380 0x80>;
+                       interrupts = <91 0x8>;
+               };
+
+               viu@2400 {
+                       compatible = "fsl,mpc5121-viu";
+                       reg = <0x2400 0x400>;
+                       interrupts = <67 0x8>;
+               };
+
+               mdio@2800 {
+                       compatible = "fsl,mpc5121-fec-mdio";
+                       reg = <0x2800 0x800>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+
+               eth0: ethernet@2800 {
+                       device_type = "network";
+                       compatible = "fsl,mpc5121-fec";
+                       reg = <0x2800 0x800>;
+                       local-mac-address = [ 00 00 00 00 00 00 ];
+                       interrupts = <4 0x8>;
+               };
+
+               /* USB1 using external ULPI PHY */
+               usb@3000 {
+                       compatible = "fsl,mpc5121-usb2-dr";
+                       reg = <0x3000 0x600>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       interrupts = <43 0x8>;
+                       dr_mode = "otg";
+                       phy_type = "ulpi";
+               };
+
+               /* USB0 using internal UTMI PHY */
+               usb@4000 {
+                       compatible = "fsl,mpc5121-usb2-dr";
+                       reg = <0x4000 0x600>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       interrupts = <44 0x8>;
+                       dr_mode = "otg";
+                       phy_type = "utmi_wide";
+               };
+
+               /* IO control */
+               ioctl@a000 {
+                       compatible = "fsl,mpc5121-ioctl";
+                       reg = <0xA000 0x1000>;
+               };
+
+               /* LocalPlus controller */
+               lpc@10000 {
+                       compatible = "fsl,mpc5121-lpc";
+                       reg = <0x10000 0x200>;
+               };
+
+               pata@10200 {
+                       compatible = "fsl,mpc5121-pata";
+                       reg = <0x10200 0x100>;
+                       interrupts = <5 0x8>;
+               };
+
+               /* 512x PSCs are not 52xx PSC compatible */
+
+               /* PSC0 */
+               psc@11000 {
+                       compatible = "fsl,mpc5121-psc";
+                       reg = <0x11000 0x100>;
+                       interrupts = <40 0x8>;
+                       fsl,rx-fifo-size = <16>;
+                       fsl,tx-fifo-size = <16>;
+               };
+
+               /* PSC1 */
+               psc@11100 {
+                       compatible = "fsl,mpc5121-psc";
+                       reg = <0x11100 0x100>;
+                       interrupts = <40 0x8>;
+                       fsl,rx-fifo-size = <16>;
+                       fsl,tx-fifo-size = <16>;
+               };
+
+               /* PSC2 */
+               psc@11200 {
+                       compatible = "fsl,mpc5121-psc";
+                       reg = <0x11200 0x100>;
+                       interrupts = <40 0x8>;
+                       fsl,rx-fifo-size = <16>;
+                       fsl,tx-fifo-size = <16>;
+               };
+
+               /* PSC3 */
+               psc@11300 {
+                       compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
+                       reg = <0x11300 0x100>;
+                       interrupts = <40 0x8>;
+                       fsl,rx-fifo-size = <16>;
+                       fsl,tx-fifo-size = <16>;
+               };
+
+               /* PSC4 */
+               psc@11400 {
+                       compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
+                       reg = <0x11400 0x100>;
+                       interrupts = <40 0x8>;
+                       fsl,rx-fifo-size = <16>;
+                       fsl,tx-fifo-size = <16>;
+               };
+
+               /* PSC5 */
+               psc@11500 {
+                       compatible = "fsl,mpc5121-psc";
+                       reg = <0x11500 0x100>;
+                       interrupts = <40 0x8>;
+                       fsl,rx-fifo-size = <16>;
+                       fsl,tx-fifo-size = <16>;
+               };
+
+               /* PSC6 */
+               psc@11600 {
+                       compatible = "fsl,mpc5121-psc";
+                       reg = <0x11600 0x100>;
+                       interrupts = <40 0x8>;
+                       fsl,rx-fifo-size = <16>;
+                       fsl,tx-fifo-size = <16>;
+               };
+
+               /* PSC7 */
+               psc@11700 {
+                       compatible = "fsl,mpc5121-psc";
+                       reg = <0x11700 0x100>;
+                       interrupts = <40 0x8>;
+                       fsl,rx-fifo-size = <16>;
+                       fsl,tx-fifo-size = <16>;
+               };
+
+               /* PSC8 */
+               psc@11800 {
+                       compatible = "fsl,mpc5121-psc";
+                       reg = <0x11800 0x100>;
+                       interrupts = <40 0x8>;
+                       fsl,rx-fifo-size = <16>;
+                       fsl,tx-fifo-size = <16>;
+               };
+
+               /* PSC9 */
+               psc@11900 {
+                       compatible = "fsl,mpc5121-psc";
+                       reg = <0x11900 0x100>;
+                       interrupts = <40 0x8>;
+                       fsl,rx-fifo-size = <16>;
+                       fsl,tx-fifo-size = <16>;
+               };
+
+               /* PSC10 */
+               psc@11a00 {
+                       compatible = "fsl,mpc5121-psc";
+                       reg = <0x11a00 0x100>;
+                       interrupts = <40 0x8>;
+                       fsl,rx-fifo-size = <16>;
+                       fsl,tx-fifo-size = <16>;
+               };
+
+               /* PSC11 */
+               psc@11b00 {
+                       compatible = "fsl,mpc5121-psc";
+                       reg = <0x11b00 0x100>;
+                       interrupts = <40 0x8>;
+                       fsl,rx-fifo-size = <16>;
+                       fsl,tx-fifo-size = <16>;
+               };
+
+               pscfifo@11f00 {
+                       compatible = "fsl,mpc5121-psc-fifo";
+                       reg = <0x11f00 0x100>;
+                       interrupts = <40 0x8>;
+               };
+
+               dma@14000 {
+                       compatible = "fsl,mpc5121-dma";
+                       reg = <0x14000 0x1800>;
+                       interrupts = <65 0x8>;
+               };
+       };
+
+       pci: pci@80008500 {
+               compatible = "fsl,mpc5121-pci";
+               device_type = "pci";
+               interrupts = <1 0x8>;
+               clock-frequency = <0>;
+               #address-cells = <3>;
+               #size-cells = <2>;
+               #interrupt-cells = <1>;
+
+               reg = <0x80008500 0x100 /* internal registers */
+                      0x80008300 0x8>; /* config space access registers */
+               bus-range = <0x0 0x0>;
+               ranges = <0x42000000 0x0 0xa0000000 0xa0000000 0x0 0x10000000
+                         0x02000000 0x0 0xb0000000 0xb0000000 0x0 0x10000000
+                         0x01000000 0x0 0x00000000 0x84000000 0x0 0x01000000>;
+       };
+};
index c9ef6bbe26cf7a43a9d240a790f466dc77ed77fb..f269b1382ef70c43048915b7ee51477013dffb19 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * MPC5121E ADS Device Tree Source
  *
- * Copyright 2007,2008 Freescale Semiconductor Inc.
+ * Copyright 2007-2008 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 the
@@ -9,74 +9,26 @@
  * option) any later version.
  */
 
-/dts-v1/;
+/include/ "mpc5121.dtsi"
 
 / {
        model = "mpc5121ads";
        compatible = "fsl,mpc5121ads";
-       #address-cells = <1>;
-       #size-cells = <1>;
-
-       aliases {
-               pci = &pci;
-       };
-
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-
-               PowerPC,5121@0 {
-                       device_type = "cpu";
-                       reg = <0>;
-                       d-cache-line-size = <0x20>;     // 32 bytes
-                       i-cache-line-size = <0x20>;     // 32 bytes
-                       d-cache-size = <0x8000>;        // L1, 32K
-                       i-cache-size = <0x8000>;        // L1, 32K
-                       timebase-frequency = <49500000>;// 49.5 MHz (csb/4)
-                       bus-frequency = <198000000>;    // 198 MHz csb bus
-                       clock-frequency = <396000000>;  // 396 MHz ppc core
-               };
-       };
-
-       memory {
-               device_type = "memory";
-               reg = <0x00000000 0x10000000>;  // 256MB at 0
-       };
-
-       mbx@20000000 {
-               compatible = "fsl,mpc5121-mbx";
-               reg = <0x20000000 0x4000>;
-               interrupts = <66 0x8>;
-               interrupt-parent = < &ipic >;
-       };
-
-       sram@30000000 {
-               compatible = "fsl,mpc5121-sram";
-               reg = <0x30000000 0x20000>;             // 128K at 0x30000000
-       };
 
        nfc@40000000 {
-               compatible = "fsl,mpc5121-nfc";
-               reg = <0x40000000 0x100000>;    // 1M at 0x40000000
-               interrupts = <6 8>;
-               interrupt-parent = < &ipic >;
-               #address-cells = <1>;
-               #size-cells = <1>;
-               // ADS has two Hynix 512MB Nand flash chips in a single
-               // stacked package.
+               /*
+                * ADS has two Hynix 512MB Nand flash chips in a single
+                * stacked package.
+                */
                chips = <2>;
+
                nand@0 {
                        label = "nand";
-                       reg = <0x00000000 0x40000000>;  // 512MB + 512MB
+                       reg = <0x00000000 0x40000000>;  /* 512MB + 512MB */
                };
        };
 
        localbus@80000020 {
-               compatible = "fsl,mpc5121-localbus";
-               #address-cells = <2>;
-               #size-cells = <1>;
-               reg = <0x80000020 0x40>;
-
                ranges = <0x0 0x0 0xfc000000 0x04000000
                          0x2 0x0 0x82000000 0x00008000>;
 
@@ -87,6 +39,7 @@
                        #size-cells = <1>;
                        bank-width = <4>;
                        device-width = <2>;
+
                        protected@0 {
                                label = "protected";
                                reg = <0x00000000 0x00040000>;  // first sector is protected
                        interrupt-controller;
                        #interrupt-cells = <2>;
                        reg = <0x2 0xa 0x5>;
-                       interrupt-parent = < &ipic >;
-                       // irq routing
-                       //      all irqs but touch screen are routed to irq0 (ipic 48)
-                       //      touch screen is statically routed to irq1 (ipic 17)
-                       //      so don't use it here
+                       /* irq routing:
+                        * all irqs but touch screen are routed to irq0 (ipic 48)
+                        * touch screen is statically routed to irq1 (ipic 17)
+                        * so don't use it here
+                        */
                        interrupts = <48 0x8>;
                };
        };
 
        soc@80000000 {
-               compatible = "fsl,mpc5121-immr";
-               #address-cells = <1>;
-               #size-cells = <1>;
-               #interrupt-cells = <2>;
-               ranges = <0x0 0x80000000 0x400000>;
-               reg = <0x80000000 0x400000>;
-               bus-frequency = <66000000>;     // 66 MHz ips bus
-
-
-               // IPIC
-               // interrupts cell = <intr #, sense>
-               // sense values match linux IORESOURCE_IRQ_* defines:
-               // sense == 8: Level, low assertion
-               // sense == 2: Edge, high-to-low change
-               //
-               ipic: interrupt-controller@c00 {
-                       compatible = "fsl,mpc5121-ipic", "fsl,ipic";
-                       interrupt-controller;
-                       #address-cells = <0>;
-                       #interrupt-cells = <2>;
-                       reg = <0xc00 0x100>;
-               };
-
-               rtc@a00 {       // Real time clock
-                       compatible = "fsl,mpc5121-rtc";
-                       reg = <0xa00 0x100>;
-                       interrupts = <79 0x8 80 0x8>;
-                       interrupt-parent = < &ipic >;
-               };
-
-               reset@e00 {     // Reset module
-                       compatible = "fsl,mpc5121-reset";
-                       reg = <0xe00 0x100>;
-               };
-
-               clock@f00 {     // Clock control
-                       compatible = "fsl,mpc5121-clock";
-                       reg = <0xf00 0x100>;
-               };
-
-               pmc@1000{  //Power Management Controller
-                       compatible = "fsl,mpc5121-pmc";
-                       reg = <0x1000 0x100>;
-                       interrupts = <83 0x2>;
-                       interrupt-parent = < &ipic >;
-               };
-
-               gpio@1100 {
-                       compatible = "fsl,mpc5121-gpio";
-                       reg = <0x1100 0x100>;
-                       interrupts = <78 0x8>;
-                       interrupt-parent = < &ipic >;
-               };
-
-               can@1300 {
-                       compatible = "fsl,mpc5121-mscan";
-                       interrupts = <12 0x8>;
-                       interrupt-parent = < &ipic >;
-                       reg = <0x1300 0x80>;
-               };
-
-               can@1380 {
-                       compatible = "fsl,mpc5121-mscan";
-                       interrupts = <13 0x8>;
-                       interrupt-parent = < &ipic >;
-                       reg = <0x1380 0x80>;
-               };
 
                i2c@1700 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "fsl,mpc5121-i2c", "fsl-i2c";
-                       reg = <0x1700 0x20>;
-                       interrupts = <9 0x8>;
-                       interrupt-parent = < &ipic >;
                        fsl,preserve-clocking;
 
                        hwmon@4a {
                        };
                };
 
-               i2c@1720 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "fsl,mpc5121-i2c", "fsl-i2c";
-                       reg = <0x1720 0x20>;
-                       interrupts = <10 0x8>;
-                       interrupt-parent = < &ipic >;
-               };
-
-               i2c@1740 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "fsl,mpc5121-i2c", "fsl-i2c";
-                       reg = <0x1740 0x20>;
-                       interrupts = <11 0x8>;
-                       interrupt-parent = < &ipic >;
+               eth0: ethernet@2800 {
+                       phy-handle = <&phy0>;
                };
 
-               i2ccontrol@1760 {
-                       compatible = "fsl,mpc5121-i2c-ctrl";
-                       reg = <0x1760 0x8>;
+               can@2300 {
+                       status = "disabled";
                };
 
-               axe@2000 {
-                       compatible = "fsl,mpc5121-axe";
-                       reg = <0x2000 0x100>;
-                       interrupts = <42 0x8>;
-                       interrupt-parent = < &ipic >;
+               can@2380 {
+                       status = "disabled";
                };
 
-               display@2100 {
-                       compatible = "fsl,mpc5121-diu";
-                       reg = <0x2100 0x100>;
-                       interrupts = <64 0x8>;
-                       interrupt-parent = < &ipic >;
+               viu@2400 {
+                       status = "disabled";
                };
 
                mdio@2800 {
-                       compatible = "fsl,mpc5121-fec-mdio";
-                       reg = <0x2800 0x800>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       phy: ethernet-phy@0 {
+                       phy0: ethernet-phy@0 {
                                reg = <1>;
-                               device_type = "ethernet-phy";
                        };
                };
 
-               ethernet@2800 {
-                       device_type = "network";
-                       compatible = "fsl,mpc5121-fec";
-                       reg = <0x2800 0x800>;
-                       local-mac-address = [ 00 00 00 00 00 00 ];
-                       interrupts = <4 0x8>;
-                       interrupt-parent = < &ipic >;
-                       phy-handle = < &phy >;
-                       fsl,align-tx-packets = <4>;
+               /* mpc5121ads only uses USB0 */
+               usb@3000 {
+                       status = "disabled";
                };
 
-               // 5121e has two dr usb modules
-               // mpc5121_ads only uses USB0
-
-               // USB1 using external ULPI PHY
-               //usb@3000 {
-               //      compatible = "fsl,mpc5121-usb2-dr";
-               //      reg = <0x3000 0x1000>;
-               //      #address-cells = <1>;
-               //      #size-cells = <0>;
-               //      interrupt-parent = < &ipic >;
-               //      interrupts = <43 0x8>;
-               //      dr_mode = "otg";
-               //      phy_type = "ulpi";
-               //};
-
-               // USB0 using internal UTMI PHY
+               /* USB0 using internal UTMI PHY */
                usb@4000 {
-                       compatible = "fsl,mpc5121-usb2-dr";
-                       reg = <0x4000 0x1000>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       interrupt-parent = < &ipic >;
-                       interrupts = <44 0x8>;
-                       dr_mode = "otg";
-                       phy_type = "utmi_wide";
+                       dr_mode = "host";
                        fsl,invert-drvvbus;
                        fsl,invert-pwr-fault;
                };
 
-               // IO control
-               ioctl@a000 {
-                       compatible = "fsl,mpc5121-ioctl";
-                       reg = <0xA000 0x1000>;
-               };
-
-               pata@10200 {
-                       compatible = "fsl,mpc5121-pata";
-                       reg = <0x10200 0x100>;
-                       interrupts = <5 0x8>;
-                       interrupt-parent = < &ipic >;
-               };
-
-               // 512x PSCs are not 52xx PSC compatible
-               // PSC3 serial port A aka ttyPSC0
-               serial@11300 {
-                       device_type = "serial";
+               /* PSC3 serial port A aka ttyPSC0 */
+               psc@11300 {
                        compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
-                       // Logical port assignment needed until driver
-                       // learns to use aliases
-                       port-number = <0>;
-                       cell-index = <3>;
-                       reg = <0x11300 0x100>;
-                       interrupts = <40 0x8>;
-                       interrupt-parent = < &ipic >;
-                       rx-fifo-size = <16>;
-                       tx-fifo-size = <16>;
                };
 
-               // PSC4 serial port B aka ttyPSC1
-               serial@11400 {
-                       device_type = "serial";
+               /* PSC4 serial port B aka ttyPSC1 */
+               psc@11400 {
                        compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
-                       // Logical port assignment needed until driver
-                       // learns to use aliases
-                       port-number = <1>;
-                       cell-index = <4>;
-                       reg = <0x11400 0x100>;
-                       interrupts = <40 0x8>;
-                       interrupt-parent = < &ipic >;
-                       rx-fifo-size = <16>;
-                       tx-fifo-size = <16>;
                };
 
-               // PSC5 in ac97 mode
-               ac97@11500 {
+               /* PSC5 in ac97 mode */
+               ac97: psc@11500 {
                        compatible = "fsl,mpc5121-psc-ac97", "fsl,mpc5121-psc";
-                       cell-index = <5>;
-                       reg = <0x11500 0x100>;
-                       interrupts = <40 0x8>;
-                       interrupt-parent = < &ipic >;
                        fsl,mode = "ac97-slave";
-                       rx-fifo-size = <384>;
-                       tx-fifo-size = <384>;
-               };
-
-               pscfifo@11f00 {
-                       compatible = "fsl,mpc5121-psc-fifo";
-                       reg = <0x11f00 0x100>;
-                       interrupts = <40 0x8>;
-                       interrupt-parent = < &ipic >;
+                       fsl,rx-fifo-size = <384>;
+                       fsl,tx-fifo-size = <384>;
                };
-
-               dma@14000 {
-                       compatible = "fsl,mpc5121-dma";
-                       reg = <0x14000 0x1800>;
-                       interrupts = <65 0x8>;
-                       interrupt-parent = < &ipic >;
-               };
-
        };
 
        pci: pci@80008500 {
                interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
                interrupt-map = <
-                               // IDSEL 0x15 - Slot 1 PCI
+                               /* IDSEL 0x15 - Slot 1 PCI */
                                 0xa800 0x0 0x0 0x1 &cpld_pic 0x0 0x8
                                 0xa800 0x0 0x0 0x2 &cpld_pic 0x1 0x8
                                 0xa800 0x0 0x0 0x3 &cpld_pic 0x2 0x8
                                 0xa800 0x0 0x0 0x4 &cpld_pic 0x3 0x8
 
-                               // IDSEL 0x16 - Slot 2 MiniPCI
+                               /* IDSEL 0x16 - Slot 2 MiniPCI */
                                 0xb000 0x0 0x0 0x1 &cpld_pic 0x4 0x8
                                 0xb000 0x0 0x0 0x2 &cpld_pic 0x5 0x8
 
-                               // IDSEL 0x17 - Slot 3 MiniPCI
+                               /* IDSEL 0x17 - Slot 3 MiniPCI */
                                 0xb800 0x0 0x0 0x1 &cpld_pic 0x6 0x8
                                 0xb800 0x0 0x0 0x2 &cpld_pic 0x7 0x8
                                >;
-               interrupt-parent = < &ipic >;
-               interrupts = <1 0x8>;
-               bus-range = <0 0>;
-               ranges = <0x42000000 0x0 0xa0000000 0xa0000000 0x0 0x10000000
-                         0x02000000 0x0 0xb0000000 0xb0000000 0x0 0x10000000
-                         0x01000000 0x0 0x00000000 0x84000000 0x0 0x01000000>;
-               clock-frequency = <0>;
-               #interrupt-cells = <1>;
-               #size-cells = <2>;
-               #address-cells = <3>;
-               reg = <0x80008500 0x100         /* internal registers */
-                      0x80008300 0x8>;         /* config space access registers */
-               compatible = "fsl,mpc5121-pci";
-               device_type = "pci";
        };
 };
index 39ed65a44c5fac5fc996b2d5ec25effbbf9853fa..969b2200b2f972b72ffd35e1004859fc7e85669d 100644 (file)
                        reg = <0x500 0x80>;
                };
 
-               timer@600 {     // General Purpose Timer
+               gpt0: timer@600 {       // General Purpose Timer
                        compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
+                       #gpio-cells = <2>;  // Add 'gpio-controller;' to enable gpio mode
                        reg = <0x600 0x10>;
                        interrupts = <1 9 0>;
+                       // add 'fsl,has-wdt' to enable watchdog
                };
 
-               timer@610 {     // General Purpose Timer
+               gpt1: timer@610 {       // General Purpose Timer
                        compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
+                       #gpio-cells = <2>;  // Add 'gpio-controller;' to enable gpio mode
                        reg = <0x610 0x10>;
                        interrupts = <1 10 0>;
                };
 
-               timer@620 {     // General Purpose Timer
+               gpt2: timer@620 {       // General Purpose Timer
                        compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
+                       #gpio-cells = <2>;  // Add 'gpio-controller;' to enable gpio mode
                        reg = <0x620 0x10>;
                        interrupts = <1 11 0>;
                };
 
-               timer@630 {     // General Purpose Timer
+               gpt3: timer@630 {       // General Purpose Timer
                        compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
+                       #gpio-cells = <2>;  // Add 'gpio-controller;' to enable gpio mode
                        reg = <0x630 0x10>;
                        interrupts = <1 12 0>;
                };
 
-               timer@640 {     // General Purpose Timer
+               gpt4: timer@640 {       // General Purpose Timer
                        compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
+                       #gpio-cells = <2>;  // Add 'gpio-controller;' to enable gpio mode
                        reg = <0x640 0x10>;
                        interrupts = <1 13 0>;
                };
 
-               timer@650 {     // General Purpose Timer
+               gpt5: timer@650 {       // General Purpose Timer
                        compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
+                       #gpio-cells = <2>;  // Add 'gpio-controller;' to enable gpio mode
                        reg = <0x650 0x10>;
                        interrupts = <1 14 0>;
                };
 
-               timer@660 {     // General Purpose Timer
+               gpt6: timer@660 {       // General Purpose Timer
                        compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
+                       #gpio-cells = <2>;  // Add 'gpio-controller;' to enable gpio mode
                        reg = <0x660 0x10>;
                        interrupts = <1 15 0>;
                };
 
-               timer@670 {     // General Purpose Timer
+               gpt7: timer@670 {       // General Purpose Timer
                        compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
+                       #gpio-cells = <2>;  // Add 'gpio-controller;' to enable gpio mode
                        reg = <0x670 0x10>;
                        interrupts = <1 16 0>;
                };
index 21d34720fcc91f4f7f3dab73c44180b0795f167c..d3a792bb5c1a8f2dc3119e4cf14a5997f7b0f9e1 100644 (file)
 
 /include/ "mpc5200b.dtsi"
 
+/* Timer pins that need to be in GPIO mode */
+&gpt0 { gpio-controller; };
+&gpt1 { gpio-controller; };
+&gpt2 { gpio-controller; };
+&gpt3 { gpio-controller; };
+
+/* Disabled timers */
+&gpt4 { status = "disabled"; };
+&gpt5 { status = "disabled"; };
+&gpt6 { status = "disabled"; };
+&gpt7 { status = "disabled"; };
+
 / {
        model = "manroland,mucmc52";
        compatible = "manroland,mucmc52";
 
        soc5200@f0000000 {
-               gpt0: timer@600 {       // GPT 0 in GPIO mode
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
-               gpt1: timer@610 {       // General Purpose Timer in GPIO mode
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
-               gpt2: timer@620 {       // General Purpose Timer in GPIO mode
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
-               gpt3: timer@630 {       // General Purpose Timer in GPIO mode
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
-               timer@640 {
-                       status = "disabled";
-               };
-
-               timer@650 {
-                       status = "disabled";
-               };
-
-               timer@660 {
-                       status = "disabled";
-               };
-
-               timer@670 {
-                       status = "disabled";
-               };
-
                rtc@800 {
                        status = "disabled";
                };
index 24f668039295b1b95ff279ff91974a7ad65582ff..cf073e693f24dde3274579d0a8799ac769da73d9 100644 (file)
 
 /include/ "mpc5200b.dtsi"
 
+&gpt0 {
+       gpio-controller;
+       fsl,has-wdt;
+       fsl,wdt-on-boot = <0>;
+};
+&gpt1 { gpio-controller; };
+
 / {
        model = "ifm,o2d";
        compatible = "ifm,o2d";
 
        soc5200@f0000000 {
 
-               gpio_simple: gpio@b00 {
-               };
-
-               timer@600 {     // General Purpose Timer
-                       #gpio-cells = <2>;
-                       gpio-controller;
-                       fsl,has-wdt;
-                       fsl,wdt-on-boot = <0>;
-               };
-
-               timer@610 {
-                       #gpio-cells = <2>;
-                       gpio-controller;
-               };
-
-               timer7: timer@670 {
-               };
-
                rtc@800 {
                        status = "disabled";
                };
                csi@3,0 {
                        compatible = "ifm,o2d-csi";
                        reg = <3 0 0x00100000>;
-                       ifm,csi-clk-handle = <&timer7>;
+                       ifm,csi-clk-handle = <&gpt7>;
                        gpios = <&gpio_simple 23 0      /* imag_capture */
                                 &gpio_simple 26 0      /* imag_reset */
                                 &gpio_simple 29 0>;    /* imag_master_en */
index 96512c05803336d937cabcf5b06aa86e43bc538b..192e66af00019bd84746edce06b1ec5e22c870dd 100644 (file)
 
 /include/ "mpc5200b.dtsi"
 
+&gpt0 { fsl,has-wdt; };
+&gpt2 { gpio-controller; };
+&gpt3 { gpio-controller; };
+&gpt4 { gpio-controller; };
+&gpt5 { gpio-controller; };
+&gpt6 { gpio-controller; };
+&gpt7 { gpio-controller; };
+
 / {
        model = "phytec,pcm030";
        compatible = "phytec,pcm030";
 
        soc5200@f0000000 {
-               timer@600 {             // General Purpose Timer
-                       fsl,has-wdt;
-               };
-
-               gpt2: timer@620 {       // General Purpose Timer in GPIO mode
-                       compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio";
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
-               gpt3: timer@630 {       // General Purpose Timer in GPIO mode
-                       compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio";
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
-               gpt4: timer@640 {       // General Purpose Timer in GPIO mode
-                       compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio";
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
-               gpt5: timer@650 {       // General Purpose Timer in GPIO mode
-                       compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio";
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
-               gpt6: timer@660 {       // General Purpose Timer in GPIO mode
-                       compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio";
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
-               gpt7: timer@670 {       // General Purpose Timer in GPIO mode
-                       compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio";
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
                audioplatform: psc@2000 { /* PSC1 in ac97 mode */
                        compatible = "mpc5200b-psc-ac97","fsl,mpc5200b-psc-ac97";
                        cell-index = <0>;
index 1dd478bfff9636cabade5cecc00b8178442f3f61..96b139bf50e9cf68ea2596a5627defb560ad707a 100644 (file)
 
 /include/ "mpc5200b.dtsi"
 
+&gpt0 { fsl,has-wdt; };
+&gpt2 { gpio-controller; };
+&gpt3 { gpio-controller; };
+&gpt4 { gpio-controller; };
+&gpt5 { gpio-controller; };
+&gpt6 { gpio-controller; };
+&gpt7 { gpio-controller; };
+
 / {
        model = "phytec,pcm032";
        compatible = "phytec,pcm032";
        };
 
        soc5200@f0000000 {
-               timer@600 {             // General Purpose Timer
-                       fsl,has-wdt;
-               };
-
-               gpt2: timer@620 {       // General Purpose Timer in GPIO mode
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
-               gpt3: timer@630 {       // General Purpose Timer in GPIO mode
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
-               gpt4: timer@640 {       // General Purpose Timer in GPIO mode
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
-               gpt5: timer@650 {       // General Purpose Timer in GPIO mode
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
-               gpt6: timer@660 {       // General Purpose Timer in GPIO mode
-                       compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-                       reg = <0x660 0x10>;
-                       interrupts = <1 15 0>;
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
-               gpt7: timer@670 {       // General Purpose Timer in GPIO mode
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
                psc@2000 {      /* PSC1 is ac97 */
                        compatible = "fsl,mpc5200b-psc-ac97","fsl,mpc5200-psc-ac97";
                        cell-index = <0>;
index 94dfa5c9a7f9d61898ca73bf4f21fcb68decc4b7..0b069477838a315d69b1a80ffeb0f6323672f796 100644 (file)
@@ -13,7 +13,7 @@
  * option) any later version.
  */
 
-/dts-v1/;
+/include/ "mpc5121.dtsi"
 
 / {
        model = "pdm360ng";
        #size-cells = <1>;
        interrupt-parent = <&ipic>;
 
-       aliases {
-               ethernet0 = &eth0;
-       };
-
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-
-               PowerPC,5121@0 {
-                       device_type = "cpu";
-                       reg = <0>;
-                       d-cache-line-size = <0x20>;     // 32 bytes
-                       i-cache-line-size = <0x20>;     // 32 bytes
-                       d-cache-size = <0x8000>;        // L1, 32K
-                       i-cache-size = <0x8000>;        // L1, 32K
-                       timebase-frequency = <49500000>;// 49.5 MHz (csb/4)
-                       bus-frequency = <198000000>;    // 198 MHz csb bus
-                       clock-frequency = <396000000>;  // 396 MHz ppc core
-               };
-       };
-
        memory {
                device_type = "memory";
                reg = <0x00000000 0x20000000>;  // 512MB at 0
        };
 
        nfc@40000000 {
-               compatible = "fsl,mpc5121-nfc";
-               reg = <0x40000000 0x100000>;
-               interrupts = <0x6 0x8>;
-               #address-cells = <0x1>;
-               #size-cells = <0x1>;
                bank-width = <0x1>;
                chips = <0x1>;
 
                };
        };
 
-       sram@50000000 {
-               compatible = "fsl,mpc5121-sram";
-               reg = <0x50000000 0x20000>;     // 128K at 0x50000000
-       };
-
        localbus@80000020 {
-               compatible = "fsl,mpc5121-localbus";
-               #address-cells = <2>;
-               #size-cells = <1>;
-               reg = <0x80000020 0x40>;
-
                ranges = <0x0 0x0 0xf0000000 0x10000000   /* Flash */
                          0x2 0x0 0x50040000 0x00020000>; /* CS2: MRAM */
 
        };
 
        soc@80000000 {
-               compatible = "fsl,mpc5121-immr";
-               #address-cells = <1>;
-               #size-cells = <1>;
-               #interrupt-cells = <2>;
-               ranges = <0x0 0x80000000 0x400000>;
-               reg = <0x80000000 0x400000>;
-               bus-frequency = <66000000>;     // 66 MHz ips bus
-
-               // IPIC
-               // interrupts cell = <intr #, sense>
-               // sense values match linux IORESOURCE_IRQ_* defines:
-               // sense == 8: Level, low assertion
-               // sense == 2: Edge, high-to-low change
-               //
-               ipic: interrupt-controller@c00 {
-                       compatible = "fsl,mpc5121-ipic", "fsl,ipic";
-                       interrupt-controller;
-                       #address-cells = <0>;
-                       #interrupt-cells = <2>;
-                       reg = <0xc00 0x100>;
-               };
-
-               rtc@a00 {       // Real time clock
-                       compatible = "fsl,mpc5121-rtc";
-                       reg = <0xa00 0x100>;
-                       interrupts = <79 0x8 80 0x8>;
-               };
-
-               reset@e00 {     // Reset module
-                       compatible = "fsl,mpc5121-reset";
-                       reg = <0xe00 0x100>;
-               };
-
-               clock@f00 {     // Clock control
-                       compatible = "fsl,mpc5121-clock";
-                       reg = <0xf00 0x100>;
-               };
-
-               pmc@1000{       //Power Management Controller
-                       compatible = "fsl,mpc5121-pmc";
-                       reg = <0x1000 0x100>;
-                       interrupts = <83 0x2>;
-               };
-
-               gpio@1100 {
-                       compatible = "fsl,mpc5121-gpio";
-                       reg = <0x1100 0x100>;
-                       interrupts = <78 0x8>;
-               };
-
-               can@1300 {
-                       compatible = "fsl,mpc5121-mscan";
-                       interrupts = <12 0x8>;
-                       reg = <0x1300 0x80>;
-               };
-
-               can@1380 {
-                       compatible = "fsl,mpc5121-mscan";
-                       interrupts = <13 0x8>;
-                       reg = <0x1380 0x80>;
-               };
 
                i2c@1700 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "fsl,mpc5121-i2c";
-                       reg = <0x1700 0x20>;
-                       interrupts = <0x9 0x8>;
                        fsl,preserve-clocking;
 
                        eeprom@50 {
                        };
                };
 
-               i2c@1740 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "fsl,mpc5121-i2c";
-                       reg = <0x1740 0x20>;
-                       interrupts = <0xb 0x8>;
-                       fsl,preserve-clocking;
-               };
-
-               i2ccontrol@1760 {
-                       compatible = "fsl,mpc5121-i2c-ctrl";
-                       reg = <0x1760 0x8>;
-               };
-
-               axe@2000 {
-                       compatible = "fsl,mpc5121-axe";
-                       reg = <0x2000 0x100>;
-                       interrupts = <42 0x8>;
-               };
-
-               display@2100 {
-                       compatible = "fsl,mpc5121-diu";
-                       reg = <0x2100 0x100>;
-                       interrupts = <64 0x8>;
+               i2c@1720 {
+                       status = "disabled";
                };
 
-               can@2300 {
-                       compatible = "fsl,mpc5121-mscan";
-                       interrupts = <90 0x8>;
-                       reg = <0x2300 0x80>;
-               };
-
-               can@2380 {
-                       compatible = "fsl,mpc5121-mscan";
-                       interrupts = <91 0x8>;
-                       reg = <0x2380 0x80>;
+               i2c@1740 {
+                       fsl,preserve-clocking;
                };
 
-               viu@2400 {
-                       compatible = "fsl,mpc5121-viu";
-                       reg = <0x2400 0x400>;
-                       interrupts = <67 0x8>;
+               ethernet@2800 {
+                       phy-handle = <&phy0>;
                };
 
                mdio@2800 {
-                       compatible = "fsl,mpc5121-fec-mdio";
-                       reg = <0x2800 0x200>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       phy: ethernet-phy@0 {
+                       phy0: ethernet-phy@1f {
                                compatible = "smsc,lan8700";
                                reg = <0x1f>;
                        };
                };
 
-               eth0: ethernet@2800 {
-                       compatible = "fsl,mpc5121-fec";
-                       reg = <0x2800 0x200>;
-                       local-mac-address = [ 00 00 00 00 00 00 ];
-                       interrupts = <4 0x8>;
-                       phy-handle = < &phy >;
-               };
-
-               // USB1 using external ULPI PHY
+               /* USB1 using external ULPI PHY */
                usb@3000 {
-                       compatible = "fsl,mpc5121-usb2-dr";
-                       reg = <0x3000 0x600>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       interrupts = <43 0x8>;
                        dr_mode = "host";
-                       phy_type = "ulpi";
                };
 
-               // USB0 using internal UTMI PHY
+               /* USB0 using internal UTMI PHY */
                usb@4000 {
-                       compatible = "fsl,mpc5121-usb2-dr";
-                       reg = <0x4000 0x600>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       interrupts = <44 0x8>;
-                       dr_mode = "otg";
-                       phy_type = "utmi_wide";
                        fsl,invert-pwr-fault;
                };
 
-               // IO control
-               ioctl@a000 {
-                       compatible = "fsl,mpc5121-ioctl";
-                       reg = <0xA000 0x1000>;
-               };
-
-               // 512x PSCs are not 52xx PSCs compatible
-               serial@11000 {
+               psc@11000 {
                        compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
-                       cell-index = <0>;
-                       reg = <0x11000 0x100>;
-                       interrupts = <40 0x8>;
-                       fsl,rx-fifo-size = <16>;
-                       fsl,tx-fifo-size = <16>;
                };
 
-               serial@11100 {
+               psc@11100 {
                        compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
-                       cell-index = <1>;
-                       reg = <0x11100 0x100>;
-                       interrupts = <40 0x8>;
-                       fsl,rx-fifo-size = <16>;
-                       fsl,tx-fifo-size = <16>;
                };
 
-               serial@11200 {
+               psc@11200 {
                        compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
-                       cell-index = <2>;
-                       reg = <0x11200 0x100>;
-                       interrupts = <40 0x8>;
-                       fsl,rx-fifo-size = <16>;
-                       fsl,tx-fifo-size = <16>;
                };
 
-               serial@11300 {
+               psc@11300 {
                        compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
-                       cell-index = <3>;
-                       reg = <0x11300 0x100>;
-                       interrupts = <40 0x8>;
-                       fsl,rx-fifo-size = <16>;
-                       fsl,tx-fifo-size = <16>;
                };
 
-               serial@11400 {
+               psc@11400 {
                        compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
-                       cell-index = <4>;
-                       reg = <0x11400 0x100>;
-                       interrupts = <40 0x8>;
-                       fsl,rx-fifo-size = <16>;
-                       fsl,tx-fifo-size = <16>;
                };
 
-               serial@11600 {
-                       compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
-                       cell-index = <6>;
-                       reg = <0x11600 0x100>;
-                       interrupts = <40 0x8>;
-                       fsl,rx-fifo-size = <16>;
-                       fsl,tx-fifo-size = <16>;
+               psc@11500 {
+                       status = "disabled";
                };
 
-               serial@11800 {
+               psc@11600 {
                        compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
-                       cell-index = <8>;
-                       reg = <0x11800 0x100>;
-                       interrupts = <40 0x8>;
-                       fsl,rx-fifo-size = <16>;
-                       fsl,tx-fifo-size = <16>;
                };
 
-               serial@11B00 {
-                       compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
-                       cell-index = <11>;
-                       reg = <0x11B00 0x100>;
-                       interrupts = <40 0x8>;
-                       fsl,rx-fifo-size = <16>;
-                       fsl,tx-fifo-size = <16>;
+               psc@11700 {
+                       status = "disabled";
                };
 
-               pscfifo@11f00 {
-                       compatible = "fsl,mpc5121-psc-fifo";
-                       reg = <0x11f00 0x100>;
-                       interrupts = <40 0x8>;
+               psc@11800 {
+                       compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
                };
 
-               spi@11900 {
+               psc@11900 {
                        compatible = "fsl,mpc5121-psc-spi", "fsl,mpc5121-psc";
-                       cell-index = <9>;
                        #address-cells = <1>;
                        #size-cells = <0>;
-                       reg = <0x11900 0x100>;
-                       interrupts = <40 0x8>;
-                       fsl,rx-fifo-size = <16>;
-                       fsl,tx-fifo-size = <16>;
 
-                       // 7845 touch screen controller
+                       /* ADS7845 touch screen controller */
                        ts@0 {
                                compatible = "ti,ads7846";
                                reg = <0x0>;
                                spi-max-frequency = <3000000>;
-                               // pen irq is GPIO25
+                               /* pen irq is GPIO25 */
                                interrupts = <78 0x8>;
                        };
                };
 
-               dma@14000 {
-                       compatible = "fsl,mpc5121-dma";
-                       reg = <0x14000 0x1800>;
-                       interrupts = <65 0x8>;
+               psc@11a00 {
+                       status = "disabled";
+               };
+
+               psc@11b00 {
+                       compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
                };
        };
 };
index ba83d5488ec6b83167df39640a80055ea29ea421..5c462194ef06000a40a745586dbe5c249ad3afab 100644 (file)
 
 /include/ "mpc5200b.dtsi"
 
+&gpt0 { gpio-controller; };
+&gpt1 { gpio-controller; };
+&gpt2 { gpio-controller; };
+&gpt3 { gpio-controller; };
+&gpt4 { gpio-controller; };
+&gpt5 { gpio-controller; };
+&gpt6 { gpio-controller; };
+&gpt7 { gpio-controller; };
+
 / {
        model = "manroland,uc101";
        compatible = "manroland,uc101";
 
        soc5200@f0000000 {
-               gpt0: timer@600 {       // General Purpose Timer in GPIO mode
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
-               gpt1: timer@610 {       // General Purpose Timer in GPIO mode
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
-               gpt2: timer@620 {       // General Purpose Timer in GPIO mode
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
-               gpt3: timer@630 {       // General Purpose Timer in GPIO mode
-                       compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-                       reg = <0x630 0x10>;
-                       interrupts = <1 12 0>;
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
-               gpt4: timer@640 {       // General Purpose Timer in GPIO mode
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
-               gpt5: timer@650 {       // General Purpose Timer in GPIO mode
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
-               gpt6: timer@660 {       // General Purpose Timer in GPIO mode
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
-               gpt7: timer@670 {       // General Purpose Timer in GPIO mode
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
                rtc@800 {
                        status = "disabled";
                };
index 8c0ab2ca689c4e6e4731de0dcec395c6313b2216..885c040d619431be02be2961393f4b7e783d6228 100644 (file)
@@ -53,4 +53,21 @@ struct mpc512x_ccm {
        u32     m4ccr;  /* MSCAN4 CCR */
        u8      res[0x98]; /* Reserved */
 };
+
+/*
+ * LPC Module
+ */
+struct mpc512x_lpc {
+       u32     cs_cfg[8];      /* CS config */
+       u32     cs_ctrl;        /* CS Control Register */
+       u32     cs_status;      /* CS Status Register */
+       u32     burst_ctrl;     /* CS Burst Control Register */
+       u32     deadcycle_ctrl; /* CS Deadcycle Control Register */
+       u32     holdcycle_ctrl; /* CS Holdcycle Control Register */
+       u32     alt;            /* Address Latch Timing Register */
+};
+
+int mpc512x_cs_config(unsigned int cs, u32 val);
+int __init mpc5121_clk_init(void);
+
 #endif /* __ASM_POWERPC_MPC5121_H__ */
index 9f771e05457c78f263843247c49588dae021e911..52d57d2817240bb472047f976e742675952c466d 100644 (file)
@@ -26,6 +26,7 @@
 
 #include <linux/of_platform.h>
 #include <asm/mpc5xxx.h>
+#include <asm/mpc5121.h>
 #include <asm/clk_interface.h>
 
 #undef CLK_DEBUG
@@ -122,7 +123,7 @@ struct mpc512x_clockctl {
        u32 dccr;               /* DIU Clk Cnfg Reg */
 };
 
-struct mpc512x_clockctl __iomem *clockctl;
+static struct mpc512x_clockctl __iomem *clockctl;
 
 static int mpc5121_clk_enable(struct clk *clk)
 {
@@ -184,7 +185,7 @@ static unsigned long spmf_mult(void)
                36, 40, 44, 48,
                52, 56, 60, 64
        };
-       int spmf = (clockctl->spmr >> 24) & 0xf;
+       int spmf = (in_be32(&clockctl->spmr) >> 24) & 0xf;
        return spmf_to_mult[spmf];
 }
 
@@ -206,7 +207,7 @@ static unsigned long sysdiv_div_x_2(void)
                52, 56, 58, 62,
                60, 64, 66,
        };
-       int sysdiv = (clockctl->scfr2 >> 26) & 0x3f;
+       int sysdiv = (in_be32(&clockctl->scfr2) >> 26) & 0x3f;
        return sysdiv_to_div_x_2[sysdiv];
 }
 
@@ -230,7 +231,7 @@ static unsigned long sys_to_ref(unsigned long rate)
 
 static long ips_to_ref(unsigned long rate)
 {
-       int ips_div = (clockctl->scfr1 >> 23) & 0x7;
+       int ips_div = (in_be32(&clockctl->scfr1) >> 23) & 0x7;
 
        rate *= ips_div;        /* csb_clk = ips_clk * ips_div */
        rate *= 2;              /* sys_clk = csb_clk * 2 */
@@ -284,7 +285,7 @@ static struct clk sys_clk = {
 
 static void diu_clk_calc(struct clk *clk)
 {
-       int diudiv_x_2 = clockctl->scfr1 & 0xff;
+       int diudiv_x_2 = in_be32(&clockctl->scfr1) & 0xff;
        unsigned long rate;
 
        rate = sys_clk.rate;
@@ -311,7 +312,7 @@ static void half_clk_calc(struct clk *clk)
 
 static void generic_div_clk_calc(struct clk *clk)
 {
-       int div = (clockctl->scfr1 >> clk->div_shift) & 0x7;
+       int div = (in_be32(&clockctl->scfr1) >> clk->div_shift) & 0x7;
 
        clk->rate = clk->parent->rate / div;
 }
@@ -329,7 +330,7 @@ static struct clk csb_clk = {
 
 static void e300_clk_calc(struct clk *clk)
 {
-       int spmf = (clockctl->spmr >> 16) & 0xf;
+       int spmf = (in_be32(&clockctl->spmr) >> 16) & 0xf;
        int ratex2 = clk->parent->rate * spmf;
 
        clk->rate = ratex2 / 2;
@@ -551,7 +552,7 @@ static struct clk ac97_clk = {
        .calc = ac97_clk_calc,
 };
 
-struct clk *rate_clks[] = {
+static struct clk *rate_clks[] = {
        &ref_clk,
        &sys_clk,
        &diu_clk,
@@ -607,7 +608,7 @@ static void rate_clks_init(void)
  * There are two clk enable registers with 32 enable bits each
  * psc clocks and device clocks are all stored in dev_clks
  */
-struct clk dev_clks[2][32];
+static struct clk dev_clks[2][32];
 
 /*
  * Given a psc number return the dev_clk
@@ -648,12 +649,12 @@ static void psc_calc_rate(struct clk *clk, int pscnum, struct device_node *np)
        out_be32(&clockctl->pccr[pscnum], 0x00020000);
        out_be32(&clockctl->pccr[pscnum], 0x00030000);
 
-       if (clockctl->pccr[pscnum] & 0x80) {
+       if (in_be32(&clockctl->pccr[pscnum]) & 0x80) {
                clk->rate = spdif_rxclk.rate;
                return;
        }
 
-       switch ((clockctl->pccr[pscnum] >> 14) & 0x3) {
+       switch ((in_be32(&clockctl->pccr[pscnum]) >> 14) & 0x3) {
        case 0:
                mclk_src = sys_clk.rate;
                break;
@@ -668,7 +669,7 @@ static void psc_calc_rate(struct clk *clk, int pscnum, struct device_node *np)
                break;
        }
 
-       mclk_div = ((clockctl->pccr[pscnum] >> 17) & 0x7fff) + 1;
+       mclk_div = ((in_be32(&clockctl->pccr[pscnum]) >> 17) & 0x7fff) + 1;
        clk->rate = mclk_src / mclk_div;
 }
 
@@ -680,13 +681,12 @@ static void psc_calc_rate(struct clk *clk, int pscnum, struct device_node *np)
 static void psc_clks_init(void)
 {
        struct device_node *np;
-       const u32 *cell_index;
        struct platform_device *ofdev;
+       u32 reg;
 
        for_each_compatible_node(np, NULL, "fsl,mpc5121-psc") {
-               cell_index = of_get_property(np, "cell-index", NULL);
-               if (cell_index) {
-                       int pscnum = *cell_index;
+               if (!of_property_read_u32(np, "reg", &reg)) {
+                       int pscnum = (reg & 0xf00) >> 8;
                        struct clk *clk = psc_dev_clk(pscnum);
 
                        clk->flags = CLK_HAS_RATE | CLK_HAS_CTRL;
@@ -696,7 +696,7 @@ static void psc_clks_init(void)
                         * AC97 is special rate clock does
                         * not go through normal path
                         */
-                       if (strcmp("ac97", np->name) == 0)
+                       if (of_device_is_compatible(np, "fsl,mpc5121-psc-ac97"))
                                clk->rate = ac97_clk.rate;
                        else
                                psc_calc_rate(clk, pscnum, np);
index c7f47cfa9c29a9b14078c5773af100b88997d02a..d30235b7e3f7fa792fdc86e0118f638e0538d90c 100644 (file)
@@ -426,8 +426,38 @@ void __init mpc512x_psc_fifo_init(void)
 
 void __init mpc512x_init(void)
 {
-       mpc512x_declare_of_platform_devices();
        mpc5121_clk_init();
+       mpc512x_declare_of_platform_devices();
        mpc512x_restart_init();
        mpc512x_psc_fifo_init();
 }
+
+/**
+ * mpc512x_cs_config - Setup chip select configuration
+ * @cs: chip select number
+ * @val: chip select configuration value
+ *
+ * Perform chip select configuration for devices on LocalPlus Bus.
+ * Intended to dynamically reconfigure the chip select parameters
+ * for configurable devices on the bus.
+ */
+int mpc512x_cs_config(unsigned int cs, u32 val)
+{
+       static struct mpc512x_lpc __iomem *lpc;
+       struct device_node *np;
+
+       if (cs > 7)
+               return -EINVAL;
+
+       if (!lpc) {
+               np = of_find_compatible_node(NULL, NULL, "fsl,mpc5121-lpc");
+               lpc = of_iomap(np, 0);
+               of_node_put(np);
+               if (!lpc)
+                       return -ENOMEM;
+       }
+
+       out_be32(&lpc->cs_cfg[cs], val);
+       return 0;
+}
+EXPORT_SYMBOL(mpc512x_cs_config);
index f9f4537f546dfc7380b73ed002b17cf924339e7c..be7b1aa4d54c5739b112cbd139b3b7e1d1b33c8e 100644 (file)
@@ -20,9 +20,9 @@
 #include <asm/mpc52xx.h>
 #include <asm/time.h>
 
-#include <sysdev/bestcomm/bestcomm.h>
-#include <sysdev/bestcomm/bestcomm_priv.h>
-#include <sysdev/bestcomm/gen_bd.h>
+#include <linux/fsl/bestcomm/bestcomm.h>
+#include <linux/fsl/bestcomm/bestcomm_priv.h>
+#include <linux/fsl/bestcomm/gen_bd.h>
 
 MODULE_AUTHOR("Grant Likely <grant.likely@secretlab.ca>");
 MODULE_DESCRIPTION("MPC5200 LocalPlus FIFO device driver");
index 48a920d514892b2e238a9bcfc60050cb25f95f00..52de8bccfb30b05cee34a1ff2c19c24f71334b83 100644 (file)
@@ -352,8 +352,6 @@ config OF_RTC
          Uses information from the OF or flattened device tree to instantiate
          platform devices for direct mapped RTC chips like the DS1742 or DS1743.
 
-source "arch/powerpc/sysdev/bestcomm/Kconfig"
-
 config SIMPLE_GPIO
        bool "Support for simple, memory-mapped GPIO controllers"
        depends on PPC
index eca3d19304c7f8f66bd81c3b54d0b84bcd8ff247..b0a518e9759978a7255a334388d53c79a387ba61 100644 (file)
@@ -26,7 +26,6 @@ obj-$(CONFIG_SIMPLE_GPIO)     += simple_gpio.o
 obj-$(CONFIG_FSL_RIO)          += fsl_rio.o fsl_rmu.o
 obj-$(CONFIG_TSI108_BRIDGE)    += tsi108_pci.o tsi108_dev.o
 obj-$(CONFIG_QUICC_ENGINE)     += qe_lib/
-obj-$(CONFIG_PPC_BESTCOMM)     += bestcomm/
 mv64x60-$(CONFIG_PCI)          += mv64x60_pci.o
 obj-$(CONFIG_MV64X60)          += $(mv64x60-y) mv64x60_pic.o mv64x60_dev.o \
                                   mv64x60_udbg.o
diff --git a/arch/powerpc/sysdev/bestcomm/Kconfig b/arch/powerpc/sysdev/bestcomm/Kconfig
deleted file mode 100644 (file)
index 29e4270..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-#
-# Kconfig options for Bestcomm
-#
-
-config PPC_BESTCOMM
-       tristate "Bestcomm DMA engine support"
-       depends on PPC_MPC52xx
-       default n
-       select PPC_LIB_RHEAP
-       help
-         BestComm is the name of the communication coprocessor found
-         on the Freescale MPC5200 family of processor.  Its usage is
-         optional for some drivers (like ATA), but required for
-         others (like FEC).
-
-         If you want to use drivers that require DMA operations,
-         answer Y or M. Otherwise say N.
-
-config PPC_BESTCOMM_ATA
-       tristate
-       depends on PPC_BESTCOMM
-       help
-         This option enables the support for the ATA task.
-
-config PPC_BESTCOMM_FEC
-       tristate
-       depends on PPC_BESTCOMM
-       help
-         This option enables the support for the FEC tasks.
-
-config PPC_BESTCOMM_GEN_BD
-       tristate
-       depends on PPC_BESTCOMM
-       help
-         This option enables the support for the GenBD tasks.
-
diff --git a/arch/powerpc/sysdev/bestcomm/Makefile b/arch/powerpc/sysdev/bestcomm/Makefile
deleted file mode 100644 (file)
index aed2df2..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#
-# Makefile for BestComm & co
-#
-
-bestcomm-core-objs     := bestcomm.o sram.o
-bestcomm-ata-objs      := ata.o bcom_ata_task.o
-bestcomm-fec-objs      := fec.o bcom_fec_rx_task.o bcom_fec_tx_task.o
-bestcomm-gen-bd-objs   := gen_bd.o bcom_gen_bd_rx_task.o bcom_gen_bd_tx_task.o
-
-obj-$(CONFIG_PPC_BESTCOMM)             += bestcomm-core.o
-obj-$(CONFIG_PPC_BESTCOMM_ATA)         += bestcomm-ata.o
-obj-$(CONFIG_PPC_BESTCOMM_FEC)         += bestcomm-fec.o
-obj-$(CONFIG_PPC_BESTCOMM_GEN_BD)      += bestcomm-gen-bd.o
diff --git a/arch/powerpc/sysdev/bestcomm/ata.c b/arch/powerpc/sysdev/bestcomm/ata.c
deleted file mode 100644 (file)
index 901c9f9..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Bestcomm ATA task driver
- *
- *
- * Patterned after bestcomm/fec.c by Dale Farnsworth <dfarnsworth@mvista.com>
- *                                   2003-2004 (c) MontaVista, Software, Inc.
- *
- * Copyright (C) 2006-2007 Sylvain Munaut <tnt@246tNt.com>
- * Copyright (C) 2006      Freescale - John Rigby
- *
- * This file is licensed under the terms of the GNU General Public License
- * version 2. This program is licensed "as is" without any warranty of any
- * kind, whether express or implied.
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/types.h>
-#include <asm/io.h>
-
-#include "bestcomm.h"
-#include "bestcomm_priv.h"
-#include "ata.h"
-
-
-/* ======================================================================== */
-/* Task image/var/inc                                                       */
-/* ======================================================================== */
-
-/* ata task image */
-extern u32 bcom_ata_task[];
-
-/* ata task vars that need to be set before enabling the task */
-struct bcom_ata_var {
-       u32 enable;             /* (u16*) address of task's control register */
-       u32 bd_base;            /* (struct bcom_bd*) beginning of ring buffer */
-       u32 bd_last;            /* (struct bcom_bd*) end of ring buffer */
-       u32 bd_start;           /* (struct bcom_bd*) current bd */
-       u32 buffer_size;        /* size of receive buffer */
-};
-
-/* ata task incs that need to be set before enabling the task */
-struct bcom_ata_inc {
-       u16 pad0;
-       s16 incr_bytes;
-       u16 pad1;
-       s16 incr_dst;
-       u16 pad2;
-       s16 incr_src;
-};
-
-
-/* ======================================================================== */
-/* Task support code                                                        */
-/* ======================================================================== */
-
-struct bcom_task *
-bcom_ata_init(int queue_len, int maxbufsize)
-{
-       struct bcom_task *tsk;
-       struct bcom_ata_var *var;
-       struct bcom_ata_inc *inc;
-
-       /* Prefetch breaks ATA DMA.  Turn it off for ATA DMA */
-       bcom_disable_prefetch();
-
-       tsk = bcom_task_alloc(queue_len, sizeof(struct bcom_ata_bd), 0);
-       if (!tsk)
-               return NULL;
-
-       tsk->flags = BCOM_FLAGS_NONE;
-
-       bcom_ata_reset_bd(tsk);
-
-       var = (struct bcom_ata_var *) bcom_task_var(tsk->tasknum);
-       inc = (struct bcom_ata_inc *) bcom_task_inc(tsk->tasknum);
-
-       if (bcom_load_image(tsk->tasknum, bcom_ata_task)) {
-               bcom_task_free(tsk);
-               return NULL;
-       }
-
-       var->enable     = bcom_eng->regs_base +
-                               offsetof(struct mpc52xx_sdma, tcr[tsk->tasknum]);
-       var->bd_base    = tsk->bd_pa;
-       var->bd_last    = tsk->bd_pa + ((tsk->num_bd-1) * tsk->bd_size);
-       var->bd_start   = tsk->bd_pa;
-       var->buffer_size = maxbufsize;
-
-       /* Configure some stuff */
-       bcom_set_task_pragma(tsk->tasknum, BCOM_ATA_PRAGMA);
-       bcom_set_task_auto_start(tsk->tasknum, tsk->tasknum);
-
-       out_8(&bcom_eng->regs->ipr[BCOM_INITIATOR_ATA_RX], BCOM_IPR_ATA_RX);
-       out_8(&bcom_eng->regs->ipr[BCOM_INITIATOR_ATA_TX], BCOM_IPR_ATA_TX);
-
-       out_be32(&bcom_eng->regs->IntPend, 1<<tsk->tasknum); /* Clear ints */
-
-       return tsk;
-}
-EXPORT_SYMBOL_GPL(bcom_ata_init);
-
-void bcom_ata_rx_prepare(struct bcom_task *tsk)
-{
-       struct bcom_ata_inc *inc;
-
-       inc = (struct bcom_ata_inc *) bcom_task_inc(tsk->tasknum);
-
-       inc->incr_bytes = -(s16)sizeof(u32);
-       inc->incr_src   = 0;
-       inc->incr_dst   = sizeof(u32);
-
-       bcom_set_initiator(tsk->tasknum, BCOM_INITIATOR_ATA_RX);
-}
-EXPORT_SYMBOL_GPL(bcom_ata_rx_prepare);
-
-void bcom_ata_tx_prepare(struct bcom_task *tsk)
-{
-       struct bcom_ata_inc *inc;
-
-       inc = (struct bcom_ata_inc *) bcom_task_inc(tsk->tasknum);
-
-       inc->incr_bytes = -(s16)sizeof(u32);
-       inc->incr_src   = sizeof(u32);
-       inc->incr_dst   = 0;
-
-       bcom_set_initiator(tsk->tasknum, BCOM_INITIATOR_ATA_TX);
-}
-EXPORT_SYMBOL_GPL(bcom_ata_tx_prepare);
-
-void bcom_ata_reset_bd(struct bcom_task *tsk)
-{
-       struct bcom_ata_var *var;
-
-       /* Reset all BD */
-       memset(tsk->bd, 0x00, tsk->num_bd * tsk->bd_size);
-
-       tsk->index = 0;
-       tsk->outdex = 0;
-
-       var = (struct bcom_ata_var *) bcom_task_var(tsk->tasknum);
-       var->bd_start = var->bd_base;
-}
-EXPORT_SYMBOL_GPL(bcom_ata_reset_bd);
-
-void bcom_ata_release(struct bcom_task *tsk)
-{
-       /* Nothing special for the ATA tasks */
-       bcom_task_free(tsk);
-}
-EXPORT_SYMBOL_GPL(bcom_ata_release);
-
-
-MODULE_DESCRIPTION("BestComm ATA task driver");
-MODULE_AUTHOR("John Rigby");
-MODULE_LICENSE("GPL v2");
-
diff --git a/arch/powerpc/sysdev/bestcomm/ata.h b/arch/powerpc/sysdev/bestcomm/ata.h
deleted file mode 100644 (file)
index 0b23718..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Header for Bestcomm ATA task driver
- *
- *
- * Copyright (C) 2006 Freescale - John Rigby
- * Copyright (C) 2006 Sylvain Munaut <tnt@246tNt.com>
- *
- * This file is licensed under the terms of the GNU General Public License
- * version 2. This program is licensed "as is" without any warranty of any
- * kind, whether express or implied.
- */
-
-#ifndef __BESTCOMM_ATA_H__
-#define __BESTCOMM_ATA_H__
-
-
-struct bcom_ata_bd {
-       u32     status;
-       u32     src_pa;
-       u32     dst_pa;
-};
-
-extern struct bcom_task * bcom_ata_init(int queue_len, int maxbufsize);
-extern void bcom_ata_rx_prepare(struct bcom_task *tsk);
-extern void bcom_ata_tx_prepare(struct bcom_task *tsk);
-extern void bcom_ata_reset_bd(struct bcom_task *tsk);
-extern void bcom_ata_release(struct bcom_task *tsk);
-
-#endif /* __BESTCOMM_ATA_H__ */
-
diff --git a/arch/powerpc/sysdev/bestcomm/bcom_ata_task.c b/arch/powerpc/sysdev/bestcomm/bcom_ata_task.c
deleted file mode 100644 (file)
index cc6049a..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Bestcomm ATA task microcode
- *
- * Copyright (c) 2004 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 version 2 as published
- * by the Free Software Foundation.
- *
- * Created based on bestcom/code_dma/image_rtos1/dma_image.hex
- */
-
-#include <asm/types.h>
-
-/*
- * The header consists of the following fields:
- *     u32     magic;
- *     u8      desc_size;
- *     u8      var_size;
- *     u8      inc_size;
- *     u8      first_var;
- *     u8      reserved[8];
- *
- * The size fields contain the number of 32-bit words.
- */
-
-u32 bcom_ata_task[] = {
-       /* header */
-       0x4243544b,
-       0x0e060709,
-       0x00000000,
-       0x00000000,
-
-       /* Task descriptors */
-       0x8198009b, /* LCD: idx0 = var3; idx0 <= var2; idx0 += inc3 */
-       0x13e00c08, /*   DRD1A: var3 = var1; FN=0 MORE init=31 WS=0 RS=0 */
-       0xb8000264, /*   LCD: idx1 = *idx0, idx2 = var0; idx1 < var9; idx1 += inc4, idx2 += inc4 */
-       0x10000f00, /*     DRD1A: var3 = idx0; FN=0 MORE init=0 WS=0 RS=0 */
-       0x60140002, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT init=0 WS=2 RS=2 */
-       0x0c8cfc8a, /*     DRD2B1: *idx2 = EU3(); EU3(*idx2,var10)  */
-       0xd8988240, /*   LCDEXT: idx1 = idx1; idx1 > var9; idx1 += inc0 */
-       0xf845e011, /*   LCDEXT: idx2 = *(idx0 + var00000015); ; idx2 += inc2 */
-       0xb845e00a, /*   LCD: idx3 = *(idx0 + var00000019); ; idx3 += inc1 */
-       0x0bfecf90, /*     DRD1A: *idx3 = *idx2; FN=0 TFD init=31 WS=3 RS=3 */
-       0x9898802d, /*   LCD: idx1 = idx1; idx1 once var0; idx1 += inc5 */
-       0x64000005, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=5 INT EXT init=0 WS=0 RS=0 */
-       0x0c0cf849, /*     DRD2B1: *idx0 = EU3(); EU3(idx1,var9)  */
-       0x000001f8, /* NOP */
-
-       /* VAR[9]-VAR[14] */
-       0x40000000,
-       0x7fff7fff,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-
-       /* INC[0]-INC[6] */
-       0x40000000,
-       0xe0000000,
-       0xe0000000,
-       0xa000000c,
-       0x20000000,
-       0x00000000,
-       0x00000000,
-};
-
diff --git a/arch/powerpc/sysdev/bestcomm/bcom_fec_rx_task.c b/arch/powerpc/sysdev/bestcomm/bcom_fec_rx_task.c
deleted file mode 100644 (file)
index a1ad6a0..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Bestcomm FEC RX task microcode
- *
- * Copyright (c) 2004 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 version 2 as published
- * by the Free Software Foundation.
- *
- * Automatically created based on BestCommAPI-2.2/code_dma/image_rtos1/dma_image.hex
- * on Tue Mar 22 11:19:38 2005 GMT
- */
-
-#include <asm/types.h>
-
-/*
- * The header consists of the following fields:
- *     u32     magic;
- *     u8      desc_size;
- *     u8      var_size;
- *     u8      inc_size;
- *     u8      first_var;
- *     u8      reserved[8];
- *
- * The size fields contain the number of 32-bit words.
- */
-
-u32 bcom_fec_rx_task[] = {
-       /* header */
-       0x4243544b,
-       0x18060709,
-       0x00000000,
-       0x00000000,
-
-       /* Task descriptors */
-       0x808220e3, /* LCD: idx0 = var1, idx1 = var4; idx1 <= var3; idx0 += inc4, idx1 += inc3 */
-       0x10601010, /*   DRD1A: var4 = var2; FN=0 MORE init=3 WS=0 RS=0 */
-       0xb8800264, /*   LCD: idx2 = *idx1, idx3 = var0; idx2 < var9; idx2 += inc4, idx3 += inc4 */
-       0x10001308, /*     DRD1A: var4 = idx1; FN=0 MORE init=0 WS=0 RS=0 */
-       0x60140002, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT init=0 WS=2 RS=2 */
-       0x0cccfcca, /*     DRD2B1: *idx3 = EU3(); EU3(*idx3,var10)  */
-       0x80004000, /*   LCDEXT: idx2 = 0x00000000; ; */
-       0xb8c58029, /*   LCD: idx3 = *(idx1 + var00000015); idx3 once var0; idx3 += inc5 */
-       0x60000002, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT init=0 WS=0 RS=0 */
-       0x088cf8cc, /*     DRD2B1: idx2 = EU3(); EU3(idx3,var12)  */
-       0x991982f2, /*   LCD: idx2 = idx2, idx3 = idx3; idx2 > var11; idx2 += inc6, idx3 += inc2 */
-       0x006acf80, /*     DRD1A: *idx3 = *idx0; FN=0 init=3 WS=1 RS=1 */
-       0x80004000, /*   LCDEXT: idx2 = 0x00000000; ; */
-       0x9999802d, /*   LCD: idx3 = idx3; idx3 once var0; idx3 += inc5 */
-       0x70000002, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT MORE init=0 WS=0 RS=0 */
-       0x034cfc4e, /*     DRD2B1: var13 = EU3(); EU3(*idx1,var14)  */
-       0x00008868, /*     DRD1A: idx2 = var13; FN=0 init=0 WS=0 RS=0 */
-       0x99198341, /*   LCD: idx2 = idx2, idx3 = idx3; idx2 > var13; idx2 += inc0, idx3 += inc1 */
-       0x007ecf80, /*     DRD1A: *idx3 = *idx0; FN=0 init=3 WS=3 RS=3 */
-       0x99198272, /*   LCD: idx2 = idx2, idx3 = idx3; idx2 > var9; idx2 += inc6, idx3 += inc2 */
-       0x046acf80, /*     DRD1A: *idx3 = *idx0; FN=0 INT init=3 WS=1 RS=1 */
-       0x9819002d, /*   LCD: idx2 = idx0; idx2 once var0; idx2 += inc5 */
-       0x0060c790, /*     DRD1A: *idx1 = *idx2; FN=0 init=3 WS=0 RS=0 */
-       0x000001f8, /*   NOP */
-
-       /* VAR[9]-VAR[14] */
-       0x40000000,
-       0x7fff7fff,
-       0x00000000,
-       0x00000003,
-       0x40000008,
-       0x43ffffff,
-
-       /* INC[0]-INC[6] */
-       0x40000000,
-       0xe0000000,
-       0xe0000000,
-       0xa0000008,
-       0x20000000,
-       0x00000000,
-       0x4000ffff,
-};
-
diff --git a/arch/powerpc/sysdev/bestcomm/bcom_fec_tx_task.c b/arch/powerpc/sysdev/bestcomm/bcom_fec_tx_task.c
deleted file mode 100644 (file)
index b1c495c..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Bestcomm FEC TX task microcode
- *
- * Copyright (c) 2004 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 version 2 as published
- * by the Free Software Foundation.
- *
- * Automatically created based on BestCommAPI-2.2/code_dma/image_rtos1/dma_image.hex
- * on Tue Mar 22 11:19:29 2005 GMT
- */
-
-#include <asm/types.h>
-
-/*
- * The header consists of the following fields:
- *     u32     magic;
- *     u8      desc_size;
- *     u8      var_size;
- *     u8      inc_size;
- *     u8      first_var;
- *     u8      reserved[8];
- *
- * The size fields contain the number of 32-bit words.
- */
-
-u32 bcom_fec_tx_task[] = {
-       /* header */
-       0x4243544b,
-       0x2407070d,
-       0x00000000,
-       0x00000000,
-
-       /* Task descriptors */
-       0x8018001b, /* LCD: idx0 = var0; idx0 <= var0; idx0 += inc3 */
-       0x60000005, /*   DRD2A: EU0=0 EU1=0 EU2=0 EU3=5 EXT init=0 WS=0 RS=0 */
-       0x01ccfc0d, /*   DRD2B1: var7 = EU3(); EU3(*idx0,var13)  */
-       0x8082a123, /* LCD: idx0 = var1, idx1 = var5; idx1 <= var4; idx0 += inc4, idx1 += inc3 */
-       0x10801418, /*   DRD1A: var5 = var3; FN=0 MORE init=4 WS=0 RS=0 */
-       0xf88103a4, /*   LCDEXT: idx2 = *idx1, idx3 = var2; idx2 < var14; idx2 += inc4, idx3 += inc4 */
-       0x801a6024, /*   LCD: idx4 = var0; ; idx4 += inc4 */
-       0x10001708, /*     DRD1A: var5 = idx1; FN=0 MORE init=0 WS=0 RS=0 */
-       0x60140002, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT init=0 WS=2 RS=2 */
-       0x0cccfccf, /*     DRD2B1: *idx3 = EU3(); EU3(*idx3,var15)  */
-       0x991a002c, /*   LCD: idx2 = idx2, idx3 = idx4; idx2 once var0; idx2 += inc5, idx3 += inc4 */
-       0x70000002, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT MORE init=0 WS=0 RS=0 */
-       0x024cfc4d, /*     DRD2B1: var9 = EU3(); EU3(*idx1,var13)  */
-       0x60000003, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=3 EXT init=0 WS=0 RS=0 */
-       0x0cccf247, /*     DRD2B1: *idx3 = EU3(); EU3(var9,var7)  */
-       0x80004000, /*   LCDEXT: idx2 = 0x00000000; ; */
-       0xb8c80029, /*   LCD: idx3 = *(idx1 + var0000001a); idx3 once var0; idx3 += inc5 */
-       0x70000002, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT MORE init=0 WS=0 RS=0 */
-       0x088cf8d1, /*     DRD2B1: idx2 = EU3(); EU3(idx3,var17)  */
-       0x00002f10, /*     DRD1A: var11 = idx2; FN=0 init=0 WS=0 RS=0 */
-       0x99198432, /*   LCD: idx2 = idx2, idx3 = idx3; idx2 > var16; idx2 += inc6, idx3 += inc2 */
-       0x008ac398, /*     DRD1A: *idx0 = *idx3; FN=0 init=4 WS=1 RS=1 */
-       0x80004000, /*   LCDEXT: idx2 = 0x00000000; ; */
-       0x9999802d, /*   LCD: idx3 = idx3; idx3 once var0; idx3 += inc5 */
-       0x70000002, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT MORE init=0 WS=0 RS=0 */
-       0x048cfc53, /*     DRD2B1: var18 = EU3(); EU3(*idx1,var19)  */
-       0x60000008, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=8 EXT init=0 WS=0 RS=0 */
-       0x088cf48b, /*     DRD2B1: idx2 = EU3(); EU3(var18,var11)  */
-       0x99198481, /*   LCD: idx2 = idx2, idx3 = idx3; idx2 > var18; idx2 += inc0, idx3 += inc1 */
-       0x009ec398, /*     DRD1A: *idx0 = *idx3; FN=0 init=4 WS=3 RS=3 */
-       0x991983b2, /*   LCD: idx2 = idx2, idx3 = idx3; idx2 > var14; idx2 += inc6, idx3 += inc2 */
-       0x088ac398, /*     DRD1A: *idx0 = *idx3; FN=0 TFD init=4 WS=1 RS=1 */
-       0x9919002d, /*   LCD: idx2 = idx2; idx2 once var0; idx2 += inc5 */
-       0x60000005, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=5 EXT init=0 WS=0 RS=0 */
-       0x0c4cf88e, /*     DRD2B1: *idx1 = EU3(); EU3(idx2,var14)  */
-       0x000001f8, /*   NOP */
-
-       /* VAR[13]-VAR[19] */
-       0x0c000000,
-       0x40000000,
-       0x7fff7fff,
-       0x00000000,
-       0x00000003,
-       0x40000004,
-       0x43ffffff,
-
-       /* INC[0]-INC[6] */
-       0x40000000,
-       0xe0000000,
-       0xe0000000,
-       0xa0000008,
-       0x20000000,
-       0x00000000,
-       0x4000ffff,
-};
-
diff --git a/arch/powerpc/sysdev/bestcomm/bcom_gen_bd_rx_task.c b/arch/powerpc/sysdev/bestcomm/bcom_gen_bd_rx_task.c
deleted file mode 100644 (file)
index efee022..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Bestcomm GenBD RX task microcode
- *
- * Copyright (C) 2006 AppSpec Computer Technologies Corp.
- *                    Jeff Gibbons <jeff.gibbons@appspec.com>
- * Copyright (c) 2004 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 version 2 as published
- * by the Free Software Foundation.
- *
- * Based on BestCommAPI-2.2/code_dma/image_rtos1/dma_image.hex
- * on Tue Mar 4 10:14:12 2006 GMT
- *
- */
-
-#include <asm/types.h>
-
-/*
- * The header consists of the following fields:
- *     u32     magic;
- *     u8      desc_size;
- *     u8      var_size;
- *     u8      inc_size;
- *     u8      first_var;
- *     u8      reserved[8];
- *
- * The size fields contain the number of 32-bit words.
- */
-
-u32 bcom_gen_bd_rx_task[] = {
-       /* header */
-       0x4243544b,
-       0x0d020409,
-       0x00000000,
-       0x00000000,
-
-       /* Task descriptors */
-       0x808220da, /* LCD: idx0 = var1, idx1 = var4; idx1 <= var3; idx0 += inc3, idx1 += inc2 */
-       0x13e01010, /*   DRD1A: var4 = var2; FN=0 MORE init=31 WS=0 RS=0 */
-       0xb880025b, /*   LCD: idx2 = *idx1, idx3 = var0; idx2 < var9; idx2 += inc3, idx3 += inc3 */
-       0x10001308, /*     DRD1A: var4 = idx1; FN=0 MORE init=0 WS=0 RS=0 */
-       0x60140002, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT init=0 WS=2 RS=2 */
-       0x0cccfcca, /*     DRD2B1: *idx3 = EU3(); EU3(*idx3,var10)  */
-       0xd9190240, /*   LCDEXT: idx2 = idx2; idx2 > var9; idx2 += inc0 */
-       0xb8c5e009, /*   LCD: idx3 = *(idx1 + var00000015); ; idx3 += inc1 */
-       0x07fecf80, /*     DRD1A: *idx3 = *idx0; FN=0 INT init=31 WS=3 RS=3 */
-       0x99190024, /*   LCD: idx2 = idx2; idx2 once var0; idx2 += inc4 */
-       0x60000005, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=5 EXT init=0 WS=0 RS=0 */
-       0x0c4cf889, /*     DRD2B1: *idx1 = EU3(); EU3(idx2,var9)  */
-       0x000001f8, /*   NOP */
-
-       /* VAR[9]-VAR[10] */
-       0x40000000,
-       0x7fff7fff,
-
-       /* INC[0]-INC[3] */
-       0x40000000,
-       0xe0000000,
-       0xa0000008,
-       0x20000000,
-};
-
diff --git a/arch/powerpc/sysdev/bestcomm/bcom_gen_bd_tx_task.c b/arch/powerpc/sysdev/bestcomm/bcom_gen_bd_tx_task.c
deleted file mode 100644 (file)
index c605aa4..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Bestcomm GenBD TX task microcode
- *
- * Copyright (C) 2006 AppSpec Computer Technologies Corp.
- *                    Jeff Gibbons <jeff.gibbons@appspec.com>
- * Copyright (c) 2004 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 version 2 as published
- * by the Free Software Foundation.
- *
- * Based on BestCommAPI-2.2/code_dma/image_rtos1/dma_image.hex
- * on Tue Mar 4 10:14:12 2006 GMT
- *
- */
-
-#include <asm/types.h>
-
-/*
- * The header consists of the following fields:
- *     u32     magic;
- *     u8      desc_size;
- *     u8      var_size;
- *     u8      inc_size;
- *     u8      first_var;
- *     u8      reserved[8];
- *
- * The size fields contain the number of 32-bit words.
- */
-
-u32 bcom_gen_bd_tx_task[] = {
-       /* header */
-       0x4243544b,
-       0x0f040609,
-       0x00000000,
-       0x00000000,
-
-       /* Task descriptors */
-       0x800220e3, /* LCD: idx0 = var0, idx1 = var4; idx1 <= var3; idx0 += inc4, idx1 += inc3 */
-       0x13e01010, /*   DRD1A: var4 = var2; FN=0 MORE init=31 WS=0 RS=0 */
-       0xb8808264, /*   LCD: idx2 = *idx1, idx3 = var1; idx2 < var9; idx2 += inc4, idx3 += inc4 */
-       0x10001308, /*     DRD1A: var4 = idx1; FN=0 MORE init=0 WS=0 RS=0 */
-       0x60140002, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT init=0 WS=2 RS=2 */
-       0x0cccfcca, /*     DRD2B1: *idx3 = EU3(); EU3(*idx3,var10)  */
-       0xd9190300, /*   LCDEXT: idx2 = idx2; idx2 > var12; idx2 += inc0 */
-       0xb8c5e009, /*   LCD: idx3 = *(idx1 + var00000015); ; idx3 += inc1 */
-       0x03fec398, /*     DRD1A: *idx0 = *idx3; FN=0 init=31 WS=3 RS=3 */
-       0x9919826a, /*   LCD: idx2 = idx2, idx3 = idx3; idx2 > var9; idx2 += inc5, idx3 += inc2 */
-       0x0feac398, /*     DRD1A: *idx0 = *idx3; FN=0 TFD INT init=31 WS=1 RS=1 */
-       0x99190036, /*   LCD: idx2 = idx2; idx2 once var0; idx2 += inc6 */
-       0x60000005, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=5 EXT init=0 WS=0 RS=0 */
-       0x0c4cf889, /*     DRD2B1: *idx1 = EU3(); EU3(idx2,var9)  */
-       0x000001f8, /*   NOP */
-
-       /* VAR[9]-VAR[12] */
-       0x40000000,
-       0x7fff7fff,
-       0x00000000,
-       0x40000004,
-
-       /* INC[0]-INC[5] */
-       0x40000000,
-       0xe0000000,
-       0xe0000000,
-       0xa0000008,
-       0x20000000,
-       0x4000ffff,
-};
-
diff --git a/arch/powerpc/sysdev/bestcomm/bestcomm.c b/arch/powerpc/sysdev/bestcomm/bestcomm.c
deleted file mode 100644 (file)
index d913063..0000000
+++ /dev/null
@@ -1,531 +0,0 @@
-/*
- * Driver for MPC52xx processor BestComm peripheral controller
- *
- *
- * Copyright (C) 2006-2007 Sylvain Munaut <tnt@246tNt.com>
- * Copyright (C) 2005      Varma Electronics Oy,
- *                         ( by Andrey Volkov <avolkov@varma-el.com> )
- * Copyright (C) 2003-2004 MontaVista, Software, Inc.
- *                         ( by Dale Farnsworth <dfarnsworth@mvista.com> )
- *
- * This file is licensed under the terms of the GNU General Public License
- * version 2. This program is licensed "as is" without any warranty of any
- * kind, whether express or implied.
- */
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/of.h>
-#include <linux/of_device.h>
-#include <linux/of_platform.h>
-#include <asm/io.h>
-#include <asm/irq.h>
-#include <asm/mpc52xx.h>
-
-#include "sram.h"
-#include "bestcomm_priv.h"
-#include "bestcomm.h"
-
-#define DRIVER_NAME "bestcomm-core"
-
-/* MPC5200 device tree match tables */
-static struct of_device_id mpc52xx_sram_ids[] = {
-       { .compatible = "fsl,mpc5200-sram", },
-       { .compatible = "mpc5200-sram", },
-       {}
-};
-
-
-struct bcom_engine *bcom_eng = NULL;
-EXPORT_SYMBOL_GPL(bcom_eng);   /* needed for inline functions */
-
-/* ======================================================================== */
-/* Public and private API                                                   */
-/* ======================================================================== */
-
-/* Private API */
-
-struct bcom_task *
-bcom_task_alloc(int bd_count, int bd_size, int priv_size)
-{
-       int i, tasknum = -1;
-       struct bcom_task *tsk;
-
-       /* Don't try to do anything if bestcomm init failed */
-       if (!bcom_eng)
-               return NULL;
-
-       /* Get and reserve a task num */
-       spin_lock(&bcom_eng->lock);
-
-       for (i=0; i<BCOM_MAX_TASKS; i++)
-               if (!bcom_eng->tdt[i].stop) {   /* we use stop as a marker */
-                       bcom_eng->tdt[i].stop = 0xfffffffful; /* dummy addr */
-                       tasknum = i;
-                       break;
-               }
-
-       spin_unlock(&bcom_eng->lock);
-
-       if (tasknum < 0)
-               return NULL;
-
-       /* Allocate our structure */
-       tsk = kzalloc(sizeof(struct bcom_task) + priv_size, GFP_KERNEL);
-       if (!tsk)
-               goto error;
-
-       tsk->tasknum = tasknum;
-       if (priv_size)
-               tsk->priv = (void*)tsk + sizeof(struct bcom_task);
-
-       /* Get IRQ of that task */
-       tsk->irq = irq_of_parse_and_map(bcom_eng->ofnode, tsk->tasknum);
-       if (tsk->irq == NO_IRQ)
-               goto error;
-
-       /* Init the BDs, if needed */
-       if (bd_count) {
-               tsk->cookie = kmalloc(sizeof(void*) * bd_count, GFP_KERNEL);
-               if (!tsk->cookie)
-                       goto error;
-
-               tsk->bd = bcom_sram_alloc(bd_count * bd_size, 4, &tsk->bd_pa);
-               if (!tsk->bd)
-                       goto error;
-               memset(tsk->bd, 0x00, bd_count * bd_size);
-
-               tsk->num_bd = bd_count;
-               tsk->bd_size = bd_size;
-       }
-
-       return tsk;
-
-error:
-       if (tsk) {
-               if (tsk->irq != NO_IRQ)
-                       irq_dispose_mapping(tsk->irq);
-               bcom_sram_free(tsk->bd);
-               kfree(tsk->cookie);
-               kfree(tsk);
-       }
-
-       bcom_eng->tdt[tasknum].stop = 0;
-
-       return NULL;
-}
-EXPORT_SYMBOL_GPL(bcom_task_alloc);
-
-void
-bcom_task_free(struct bcom_task *tsk)
-{
-       /* Stop the task */
-       bcom_disable_task(tsk->tasknum);
-
-       /* Clear TDT */
-       bcom_eng->tdt[tsk->tasknum].start = 0;
-       bcom_eng->tdt[tsk->tasknum].stop  = 0;
-
-       /* Free everything */
-       irq_dispose_mapping(tsk->irq);
-       bcom_sram_free(tsk->bd);
-       kfree(tsk->cookie);
-       kfree(tsk);
-}
-EXPORT_SYMBOL_GPL(bcom_task_free);
-
-int
-bcom_load_image(int task, u32 *task_image)
-{
-       struct bcom_task_header *hdr = (struct bcom_task_header *)task_image;
-       struct bcom_tdt *tdt;
-       u32 *desc, *var, *inc;
-       u32 *desc_src, *var_src, *inc_src;
-
-       /* Safety checks */
-       if (hdr->magic != BCOM_TASK_MAGIC) {
-               printk(KERN_ERR DRIVER_NAME
-                       ": Trying to load invalid microcode\n");
-               return -EINVAL;
-       }
-
-       if ((task < 0) || (task >= BCOM_MAX_TASKS)) {
-               printk(KERN_ERR DRIVER_NAME
-                       ": Trying to load invalid task %d\n", task);
-               return -EINVAL;
-       }
-
-       /* Initial load or reload */
-       tdt = &bcom_eng->tdt[task];
-
-       if (tdt->start) {
-               desc = bcom_task_desc(task);
-               if (hdr->desc_size != bcom_task_num_descs(task)) {
-                       printk(KERN_ERR DRIVER_NAME
-                               ": Trying to reload wrong task image "
-                               "(%d size %d/%d)!\n",
-                               task,
-                               hdr->desc_size,
-                               bcom_task_num_descs(task));
-                       return -EINVAL;
-               }
-       } else {
-               phys_addr_t start_pa;
-
-               desc = bcom_sram_alloc(hdr->desc_size * sizeof(u32), 4, &start_pa);
-               if (!desc)
-                       return -ENOMEM;
-
-               tdt->start = start_pa;
-               tdt->stop = start_pa + ((hdr->desc_size-1) * sizeof(u32));
-       }
-
-       var = bcom_task_var(task);
-       inc = bcom_task_inc(task);
-
-       /* Clear & copy */
-       memset(var, 0x00, BCOM_VAR_SIZE);
-       memset(inc, 0x00, BCOM_INC_SIZE);
-
-       desc_src = (u32 *)(hdr + 1);
-       var_src = desc_src + hdr->desc_size;
-       inc_src = var_src + hdr->var_size;
-
-       memcpy(desc, desc_src, hdr->desc_size * sizeof(u32));
-       memcpy(var + hdr->first_var, var_src, hdr->var_size * sizeof(u32));
-       memcpy(inc, inc_src, hdr->inc_size * sizeof(u32));
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(bcom_load_image);
-
-void
-bcom_set_initiator(int task, int initiator)
-{
-       int i;
-       int num_descs;
-       u32 *desc;
-       int next_drd_has_initiator;
-
-       bcom_set_tcr_initiator(task, initiator);
-
-       /* Just setting tcr is apparently not enough due to some problem */
-       /* with it. So we just go thru all the microcode and replace in  */
-       /* the DRD directly */
-
-       desc = bcom_task_desc(task);
-       next_drd_has_initiator = 1;
-       num_descs = bcom_task_num_descs(task);
-
-       for (i=0; i<num_descs; i++, desc++) {
-               if (!bcom_desc_is_drd(*desc))
-                       continue;
-               if (next_drd_has_initiator)
-                       if (bcom_desc_initiator(*desc) != BCOM_INITIATOR_ALWAYS)
-                               bcom_set_desc_initiator(desc, initiator);
-               next_drd_has_initiator = !bcom_drd_is_extended(*desc);
-       }
-}
-EXPORT_SYMBOL_GPL(bcom_set_initiator);
-
-
-/* Public API */
-
-void
-bcom_enable(struct bcom_task *tsk)
-{
-       bcom_enable_task(tsk->tasknum);
-}
-EXPORT_SYMBOL_GPL(bcom_enable);
-
-void
-bcom_disable(struct bcom_task *tsk)
-{
-       bcom_disable_task(tsk->tasknum);
-}
-EXPORT_SYMBOL_GPL(bcom_disable);
-
-
-/* ======================================================================== */
-/* Engine init/cleanup                                                      */
-/* ======================================================================== */
-
-/* Function Descriptor table */
-/* this will need to be updated if Freescale changes their task code FDT */
-static u32 fdt_ops[] = {
-       0xa0045670,     /* FDT[48] - load_acc()   */
-       0x80045670,     /* FDT[49] - unload_acc() */
-       0x21800000,     /* FDT[50] - and()        */
-       0x21e00000,     /* FDT[51] - or()         */
-       0x21500000,     /* FDT[52] - xor()        */
-       0x21400000,     /* FDT[53] - andn()       */
-       0x21500000,     /* FDT[54] - not()        */
-       0x20400000,     /* FDT[55] - add()        */
-       0x20500000,     /* FDT[56] - sub()        */
-       0x20800000,     /* FDT[57] - lsh()        */
-       0x20a00000,     /* FDT[58] - rsh()        */
-       0xc0170000,     /* FDT[59] - crc8()       */
-       0xc0145670,     /* FDT[60] - crc16()      */
-       0xc0345670,     /* FDT[61] - crc32()      */
-       0xa0076540,     /* FDT[62] - endian32()   */
-       0xa0000760,     /* FDT[63] - endian16()   */
-};
-
-
-static int bcom_engine_init(void)
-{
-       int task;
-       phys_addr_t tdt_pa, ctx_pa, var_pa, fdt_pa;
-       unsigned int tdt_size, ctx_size, var_size, fdt_size;
-
-       /* Allocate & clear SRAM zones for FDT, TDTs, contexts and vars/incs */
-       tdt_size = BCOM_MAX_TASKS * sizeof(struct bcom_tdt);
-       ctx_size = BCOM_MAX_TASKS * BCOM_CTX_SIZE;
-       var_size = BCOM_MAX_TASKS * (BCOM_VAR_SIZE + BCOM_INC_SIZE);
-       fdt_size = BCOM_FDT_SIZE;
-
-       bcom_eng->tdt = bcom_sram_alloc(tdt_size, sizeof(u32), &tdt_pa);
-       bcom_eng->ctx = bcom_sram_alloc(ctx_size, BCOM_CTX_ALIGN, &ctx_pa);
-       bcom_eng->var = bcom_sram_alloc(var_size, BCOM_VAR_ALIGN, &var_pa);
-       bcom_eng->fdt = bcom_sram_alloc(fdt_size, BCOM_FDT_ALIGN, &fdt_pa);
-
-       if (!bcom_eng->tdt || !bcom_eng->ctx || !bcom_eng->var || !bcom_eng->fdt) {
-               printk(KERN_ERR "DMA: SRAM alloc failed in engine init !\n");
-
-               bcom_sram_free(bcom_eng->tdt);
-               bcom_sram_free(bcom_eng->ctx);
-               bcom_sram_free(bcom_eng->var);
-               bcom_sram_free(bcom_eng->fdt);
-
-               return -ENOMEM;
-       }
-
-       memset(bcom_eng->tdt, 0x00, tdt_size);
-       memset(bcom_eng->ctx, 0x00, ctx_size);
-       memset(bcom_eng->var, 0x00, var_size);
-       memset(bcom_eng->fdt, 0x00, fdt_size);
-
-       /* Copy the FDT for the EU#3 */
-       memcpy(&bcom_eng->fdt[48], fdt_ops, sizeof(fdt_ops));
-
-       /* Initialize Task base structure */
-       for (task=0; task<BCOM_MAX_TASKS; task++)
-       {
-               out_be16(&bcom_eng->regs->tcr[task], 0);
-               out_8(&bcom_eng->regs->ipr[task], 0);
-
-               bcom_eng->tdt[task].context     = ctx_pa;
-               bcom_eng->tdt[task].var = var_pa;
-               bcom_eng->tdt[task].fdt = fdt_pa;
-
-               var_pa += BCOM_VAR_SIZE + BCOM_INC_SIZE;
-               ctx_pa += BCOM_CTX_SIZE;
-       }
-
-       out_be32(&bcom_eng->regs->taskBar, tdt_pa);
-
-       /* Init 'always' initiator */
-       out_8(&bcom_eng->regs->ipr[BCOM_INITIATOR_ALWAYS], BCOM_IPR_ALWAYS);
-
-       /* Disable COMM Bus Prefetch on the original 5200; it's broken */
-       if ((mfspr(SPRN_SVR) & MPC5200_SVR_MASK) == MPC5200_SVR)
-               bcom_disable_prefetch();
-
-       /* Init lock */
-       spin_lock_init(&bcom_eng->lock);
-
-       return 0;
-}
-
-static void
-bcom_engine_cleanup(void)
-{
-       int task;
-
-       /* Stop all tasks */
-       for (task=0; task<BCOM_MAX_TASKS; task++)
-       {
-               out_be16(&bcom_eng->regs->tcr[task], 0);
-               out_8(&bcom_eng->regs->ipr[task], 0);
-       }
-
-       out_be32(&bcom_eng->regs->taskBar, 0ul);
-
-       /* Release the SRAM zones */
-       bcom_sram_free(bcom_eng->tdt);
-       bcom_sram_free(bcom_eng->ctx);
-       bcom_sram_free(bcom_eng->var);
-       bcom_sram_free(bcom_eng->fdt);
-}
-
-
-/* ======================================================================== */
-/* OF platform driver                                                       */
-/* ======================================================================== */
-
-static int mpc52xx_bcom_probe(struct platform_device *op)
-{
-       struct device_node *ofn_sram;
-       struct resource res_bcom;
-
-       int rv;
-
-       /* Inform user we're ok so far */
-       printk(KERN_INFO "DMA: MPC52xx BestComm driver\n");
-
-       /* Get the bestcomm node */
-       of_node_get(op->dev.of_node);
-
-       /* Prepare SRAM */
-       ofn_sram = of_find_matching_node(NULL, mpc52xx_sram_ids);
-       if (!ofn_sram) {
-               printk(KERN_ERR DRIVER_NAME ": "
-                       "No SRAM found in device tree\n");
-               rv = -ENODEV;
-               goto error_ofput;
-       }
-       rv = bcom_sram_init(ofn_sram, DRIVER_NAME);
-       of_node_put(ofn_sram);
-
-       if (rv) {
-               printk(KERN_ERR DRIVER_NAME ": "
-                       "Error in SRAM init\n");
-               goto error_ofput;
-       }
-
-       /* Get a clean struct */
-       bcom_eng = kzalloc(sizeof(struct bcom_engine), GFP_KERNEL);
-       if (!bcom_eng) {
-               printk(KERN_ERR DRIVER_NAME ": "
-                       "Can't allocate state structure\n");
-               rv = -ENOMEM;
-               goto error_sramclean;
-       }
-
-       /* Save the node */
-       bcom_eng->ofnode = op->dev.of_node;
-
-       /* Get, reserve & map io */
-       if (of_address_to_resource(op->dev.of_node, 0, &res_bcom)) {
-               printk(KERN_ERR DRIVER_NAME ": "
-                       "Can't get resource\n");
-               rv = -EINVAL;
-               goto error_sramclean;
-       }
-
-       if (!request_mem_region(res_bcom.start, sizeof(struct mpc52xx_sdma),
-                               DRIVER_NAME)) {
-               printk(KERN_ERR DRIVER_NAME ": "
-                       "Can't request registers region\n");
-               rv = -EBUSY;
-               goto error_sramclean;
-       }
-
-       bcom_eng->regs_base = res_bcom.start;
-       bcom_eng->regs = ioremap(res_bcom.start, sizeof(struct mpc52xx_sdma));
-       if (!bcom_eng->regs) {
-               printk(KERN_ERR DRIVER_NAME ": "
-                       "Can't map registers\n");
-               rv = -ENOMEM;
-               goto error_release;
-       }
-
-       /* Now, do the real init */
-       rv = bcom_engine_init();
-       if (rv)
-               goto error_unmap;
-
-       /* Done ! */
-       printk(KERN_INFO "DMA: MPC52xx BestComm engine @%08lx ok !\n",
-               (long)bcom_eng->regs_base);
-
-       return 0;
-
-       /* Error path */
-error_unmap:
-       iounmap(bcom_eng->regs);
-error_release:
-       release_mem_region(res_bcom.start, sizeof(struct mpc52xx_sdma));
-error_sramclean:
-       kfree(bcom_eng);
-       bcom_sram_cleanup();
-error_ofput:
-       of_node_put(op->dev.of_node);
-
-       printk(KERN_ERR "DMA: MPC52xx BestComm init failed !\n");
-
-       return rv;
-}
-
-
-static int mpc52xx_bcom_remove(struct platform_device *op)
-{
-       /* Clean up the engine */
-       bcom_engine_cleanup();
-
-       /* Cleanup SRAM */
-       bcom_sram_cleanup();
-
-       /* Release regs */
-       iounmap(bcom_eng->regs);
-       release_mem_region(bcom_eng->regs_base, sizeof(struct mpc52xx_sdma));
-
-       /* Release the node */
-       of_node_put(bcom_eng->ofnode);
-
-       /* Release memory */
-       kfree(bcom_eng);
-       bcom_eng = NULL;
-
-       return 0;
-}
-
-static struct of_device_id mpc52xx_bcom_of_match[] = {
-       { .compatible = "fsl,mpc5200-bestcomm", },
-       { .compatible = "mpc5200-bestcomm", },
-       {},
-};
-
-MODULE_DEVICE_TABLE(of, mpc52xx_bcom_of_match);
-
-
-static struct platform_driver mpc52xx_bcom_of_platform_driver = {
-       .probe          = mpc52xx_bcom_probe,
-       .remove         = mpc52xx_bcom_remove,
-       .driver = {
-               .name = DRIVER_NAME,
-               .owner = THIS_MODULE,
-               .of_match_table = mpc52xx_bcom_of_match,
-       },
-};
-
-
-/* ======================================================================== */
-/* Module                                                                   */
-/* ======================================================================== */
-
-static int __init
-mpc52xx_bcom_init(void)
-{
-       return platform_driver_register(&mpc52xx_bcom_of_platform_driver);
-}
-
-static void __exit
-mpc52xx_bcom_exit(void)
-{
-       platform_driver_unregister(&mpc52xx_bcom_of_platform_driver);
-}
-
-/* If we're not a module, we must make sure everything is setup before  */
-/* anyone tries to use us ... that's why we use subsys_initcall instead */
-/* of module_init. */
-subsys_initcall(mpc52xx_bcom_init);
-module_exit(mpc52xx_bcom_exit);
-
-MODULE_DESCRIPTION("Freescale MPC52xx BestComm DMA");
-MODULE_AUTHOR("Sylvain Munaut <tnt@246tNt.com>");
-MODULE_AUTHOR("Andrey Volkov <avolkov@varma-el.com>");
-MODULE_AUTHOR("Dale Farnsworth <dfarnsworth@mvista.com>");
-MODULE_LICENSE("GPL v2");
-
diff --git a/arch/powerpc/sysdev/bestcomm/bestcomm.h b/arch/powerpc/sysdev/bestcomm/bestcomm.h
deleted file mode 100644 (file)
index a0e2e6b..0000000
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Public header for the MPC52xx processor BestComm driver
- *
- *
- * Copyright (C) 2006      Sylvain Munaut <tnt@246tNt.com>
- * Copyright (C) 2005      Varma Electronics Oy,
- *                         ( by Andrey Volkov <avolkov@varma-el.com> )
- * Copyright (C) 2003-2004 MontaVista, Software, Inc.
- *                         ( by Dale Farnsworth <dfarnsworth@mvista.com> )
- *
- * This file is licensed under the terms of the GNU General Public License
- * version 2. This program is licensed "as is" without any warranty of any
- * kind, whether express or implied.
- */
-
-#ifndef __BESTCOMM_H__
-#define __BESTCOMM_H__
-
-/**
- * struct bcom_bd - Structure describing a generic BestComm buffer descriptor
- * @status: The current status of this buffer. Exact meaning depends on the
- *          task type
- * @data: An array of u32 extra data.  Size of array is task dependent.
- *
- * Note: Don't dereference a bcom_bd pointer as an array.  The size of the
- *       bcom_bd is variable.  Use bcom_get_bd() instead.
- */
-struct bcom_bd {
-       u32     status;
-       u32     data[0];        /* variable payload size */
-};
-
-/* ======================================================================== */
-/* Generic task management                                                   */
-/* ======================================================================== */
-
-/**
- * struct bcom_task - Structure describing a loaded BestComm task
- *
- * This structure is never built by the driver it self. It's built and
- * filled the intermediate layer of the BestComm API, the task dependent
- * support code.
- *
- * Most likely you don't need to poke around inside this structure. The
- * fields are exposed in the header just for the sake of inline functions
- */
-struct bcom_task {
-       unsigned int    tasknum;
-       unsigned int    flags;
-       int             irq;
-
-       struct bcom_bd  *bd;
-       phys_addr_t     bd_pa;
-       void            **cookie;
-       unsigned short  index;
-       unsigned short  outdex;
-       unsigned int    num_bd;
-       unsigned int    bd_size;
-
-       void*           priv;
-};
-
-#define BCOM_FLAGS_NONE         0x00000000ul
-#define BCOM_FLAGS_ENABLE_TASK  (1ul <<  0)
-
-/**
- * bcom_enable - Enable a BestComm task
- * @tsk: The BestComm task structure
- *
- * This function makes sure the given task is enabled and can be run
- * by the BestComm engine as needed
- */
-extern void bcom_enable(struct bcom_task *tsk);
-
-/**
- * bcom_disable - Disable a BestComm task
- * @tsk: The BestComm task structure
- *
- * This function disable a given task, making sure it's not executed
- * by the BestComm engine.
- */
-extern void bcom_disable(struct bcom_task *tsk);
-
-
-/**
- * bcom_get_task_irq - Returns the irq number of a BestComm task
- * @tsk: The BestComm task structure
- */
-static inline int
-bcom_get_task_irq(struct bcom_task *tsk) {
-       return tsk->irq;
-}
-
-/* ======================================================================== */
-/* BD based tasks helpers                                                   */
-/* ======================================================================== */
-
-#define BCOM_BD_READY  0x40000000ul
-
-/** _bcom_next_index - Get next input index.
- * @tsk: pointer to task structure
- *
- * Support function; Device drivers should not call this
- */
-static inline int
-_bcom_next_index(struct bcom_task *tsk)
-{
-       return ((tsk->index + 1) == tsk->num_bd) ? 0 : tsk->index + 1;
-}
-
-/** _bcom_next_outdex - Get next output index.
- * @tsk: pointer to task structure
- *
- * Support function; Device drivers should not call this
- */
-static inline int
-_bcom_next_outdex(struct bcom_task *tsk)
-{
-       return ((tsk->outdex + 1) == tsk->num_bd) ? 0 : tsk->outdex + 1;
-}
-
-/**
- * bcom_queue_empty - Checks if a BestComm task BD queue is empty
- * @tsk: The BestComm task structure
- */
-static inline int
-bcom_queue_empty(struct bcom_task *tsk)
-{
-       return tsk->index == tsk->outdex;
-}
-
-/**
- * bcom_queue_full - Checks if a BestComm task BD queue is full
- * @tsk: The BestComm task structure
- */
-static inline int
-bcom_queue_full(struct bcom_task *tsk)
-{
-       return tsk->outdex == _bcom_next_index(tsk);
-}
-
-/**
- * bcom_get_bd - Get a BD from the queue
- * @tsk: The BestComm task structure
- * index: Index of the BD to fetch
- */
-static inline struct bcom_bd
-*bcom_get_bd(struct bcom_task *tsk, unsigned int index)
-{
-       /* A cast to (void*) so the address can be incremented by the
-        * real size instead of by sizeof(struct bcom_bd) */
-       return ((void *)tsk->bd) + (index * tsk->bd_size);
-}
-
-/**
- * bcom_buffer_done - Checks if a BestComm 
- * @tsk: The BestComm task structure
- */
-static inline int
-bcom_buffer_done(struct bcom_task *tsk)
-{
-       struct bcom_bd *bd;
-       if (bcom_queue_empty(tsk))
-               return 0;
-
-       bd = bcom_get_bd(tsk, tsk->outdex);
-       return !(bd->status & BCOM_BD_READY);
-}
-
-/**
- * bcom_prepare_next_buffer - clear status of next available buffer.
- * @tsk: The BestComm task structure
- *
- * Returns pointer to next buffer descriptor
- */
-static inline struct bcom_bd *
-bcom_prepare_next_buffer(struct bcom_task *tsk)
-{
-       struct bcom_bd *bd;
-
-       bd = bcom_get_bd(tsk, tsk->index);
-       bd->status = 0; /* cleanup last status */
-       return bd;
-}
-
-static inline void
-bcom_submit_next_buffer(struct bcom_task *tsk, void *cookie)
-{
-       struct bcom_bd *bd = bcom_get_bd(tsk, tsk->index);
-
-       tsk->cookie[tsk->index] = cookie;
-       mb();   /* ensure the bd is really up-to-date */
-       bd->status |= BCOM_BD_READY;
-       tsk->index = _bcom_next_index(tsk);
-       if (tsk->flags & BCOM_FLAGS_ENABLE_TASK)
-               bcom_enable(tsk);
-}
-
-static inline void *
-bcom_retrieve_buffer(struct bcom_task *tsk, u32 *p_status, struct bcom_bd **p_bd)
-{
-       void *cookie = tsk->cookie[tsk->outdex];
-       struct bcom_bd *bd = bcom_get_bd(tsk, tsk->outdex);
-
-       if (p_status)
-               *p_status = bd->status;
-       if (p_bd)
-               *p_bd = bd;
-       tsk->outdex = _bcom_next_outdex(tsk);
-       return cookie;
-}
-
-#endif /* __BESTCOMM_H__ */
diff --git a/arch/powerpc/sysdev/bestcomm/bestcomm_priv.h b/arch/powerpc/sysdev/bestcomm/bestcomm_priv.h
deleted file mode 100644 (file)
index 3b52f3f..0000000
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * Private header for the MPC52xx processor BestComm driver
- *
- * By private, we mean that driver should not use it directly. It's meant
- * to be used by the BestComm engine driver itself and by the intermediate
- * layer between the core and the drivers.
- *
- * Copyright (C) 2006      Sylvain Munaut <tnt@246tNt.com>
- * Copyright (C) 2005      Varma Electronics Oy,
- *                         ( by Andrey Volkov <avolkov@varma-el.com> )
- * Copyright (C) 2003-2004 MontaVista, Software, Inc.
- *                         ( by Dale Farnsworth <dfarnsworth@mvista.com> )
- *
- * This file is licensed under the terms of the GNU General Public License
- * version 2. This program is licensed "as is" without any warranty of any
- * kind, whether express or implied.
- */
-
-#ifndef __BESTCOMM_PRIV_H__
-#define __BESTCOMM_PRIV_H__
-
-#include <linux/spinlock.h>
-#include <linux/of.h>
-#include <asm/io.h>
-#include <asm/mpc52xx.h>
-
-#include "sram.h"
-
-
-/* ======================================================================== */
-/* Engine related stuff                                                     */
-/* ======================================================================== */
-
-/* Zones sizes and needed alignments */
-#define BCOM_MAX_TASKS         16
-#define BCOM_MAX_VAR           24
-#define BCOM_MAX_INC           8
-#define BCOM_MAX_FDT           64
-#define BCOM_MAX_CTX           20
-#define BCOM_CTX_SIZE          (BCOM_MAX_CTX * sizeof(u32))
-#define BCOM_CTX_ALIGN         0x100
-#define BCOM_VAR_SIZE          (BCOM_MAX_VAR * sizeof(u32))
-#define BCOM_INC_SIZE          (BCOM_MAX_INC * sizeof(u32))
-#define BCOM_VAR_ALIGN         0x80
-#define BCOM_FDT_SIZE          (BCOM_MAX_FDT * sizeof(u32))
-#define BCOM_FDT_ALIGN         0x100
-
-/**
- * struct bcom_tdt - Task Descriptor Table Entry
- *
- */
-struct bcom_tdt {
-       u32 start;
-       u32 stop;
-       u32 var;
-       u32 fdt;
-       u32 exec_status;        /* used internally by BestComm engine */
-       u32 mvtp;               /* used internally by BestComm engine */
-       u32 context;
-       u32 litbase;
-};
-
-/**
- * struct bcom_engine
- *
- * This holds all info needed globaly to handle the engine
- */
-struct bcom_engine {
-       struct device_node              *ofnode;
-       struct mpc52xx_sdma __iomem     *regs;
-       phys_addr_t                      regs_base;
-
-       struct bcom_tdt                 *tdt;
-       u32                             *ctx;
-       u32                             *var;
-       u32                             *fdt;
-
-       spinlock_t                      lock;
-};
-
-extern struct bcom_engine *bcom_eng;
-
-
-/* ======================================================================== */
-/* Tasks related stuff                                                      */
-/* ======================================================================== */
-
-/* Tasks image header */
-#define BCOM_TASK_MAGIC                0x4243544B      /* 'BCTK' */
-
-struct bcom_task_header {
-       u32     magic;
-       u8      desc_size;      /* the size fields     */
-       u8      var_size;       /* are given in number */
-       u8      inc_size;       /* of 32-bits words    */
-       u8      first_var;
-       u8      reserved[8];
-};
-
-/* Descriptors structure & co */
-#define BCOM_DESC_NOP          0x000001f8
-#define BCOM_LCD_MASK          0x80000000
-#define BCOM_DRD_EXTENDED      0x40000000
-#define BCOM_DRD_INITIATOR_SHIFT       21
-
-/* Tasks pragma */
-#define BCOM_PRAGMA_BIT_RSV            7       /* reserved pragma bit */
-#define BCOM_PRAGMA_BIT_PRECISE_INC    6       /* increment 0=when possible, */
-                                               /*           1=iter end */
-#define BCOM_PRAGMA_BIT_RST_ERROR_NO   5       /* don't reset errors on */
-                                               /* task enable */
-#define BCOM_PRAGMA_BIT_PACK           4       /* pack data enable */
-#define BCOM_PRAGMA_BIT_INTEGER                3       /* data alignment */
-                                               /* 0=frac(msb), 1=int(lsb) */
-#define BCOM_PRAGMA_BIT_SPECREAD       2       /* XLB speculative read */
-#define BCOM_PRAGMA_BIT_CW             1       /* write line buffer enable */
-#define BCOM_PRAGMA_BIT_RL             0       /* read line buffer enable */
-
-       /* Looks like XLB speculative read generates XLB errors when a buffer
-        * is at the end of the physical memory. i.e. when accessing the
-        * lasts words, the engine tries to prefetch the next but there is no
-        * next ...
-        */
-#define BCOM_STD_PRAGMA                ((0 << BCOM_PRAGMA_BIT_RSV)             | \
-                                (0 << BCOM_PRAGMA_BIT_PRECISE_INC)     | \
-                                (0 << BCOM_PRAGMA_BIT_RST_ERROR_NO)    | \
-                                (0 << BCOM_PRAGMA_BIT_PACK)            | \
-                                (0 << BCOM_PRAGMA_BIT_INTEGER)         | \
-                                (0 << BCOM_PRAGMA_BIT_SPECREAD)        | \
-                                (1 << BCOM_PRAGMA_BIT_CW)              | \
-                                (1 << BCOM_PRAGMA_BIT_RL))
-
-#define BCOM_PCI_PRAGMA                ((0 << BCOM_PRAGMA_BIT_RSV)             | \
-                                (0 << BCOM_PRAGMA_BIT_PRECISE_INC)     | \
-                                (0 << BCOM_PRAGMA_BIT_RST_ERROR_NO)    | \
-                                (0 << BCOM_PRAGMA_BIT_PACK)            | \
-                                (1 << BCOM_PRAGMA_BIT_INTEGER)         | \
-                                (0 << BCOM_PRAGMA_BIT_SPECREAD)        | \
-                                (1 << BCOM_PRAGMA_BIT_CW)              | \
-                                (1 << BCOM_PRAGMA_BIT_RL))
-
-#define BCOM_ATA_PRAGMA                BCOM_STD_PRAGMA
-#define BCOM_CRC16_DP_0_PRAGMA BCOM_STD_PRAGMA
-#define BCOM_CRC16_DP_1_PRAGMA BCOM_STD_PRAGMA
-#define BCOM_FEC_RX_BD_PRAGMA  BCOM_STD_PRAGMA
-#define BCOM_FEC_TX_BD_PRAGMA  BCOM_STD_PRAGMA
-#define BCOM_GEN_DP_0_PRAGMA   BCOM_STD_PRAGMA
-#define BCOM_GEN_DP_1_PRAGMA   BCOM_STD_PRAGMA
-#define BCOM_GEN_DP_2_PRAGMA   BCOM_STD_PRAGMA
-#define BCOM_GEN_DP_3_PRAGMA   BCOM_STD_PRAGMA
-#define BCOM_GEN_DP_BD_0_PRAGMA        BCOM_STD_PRAGMA
-#define BCOM_GEN_DP_BD_1_PRAGMA        BCOM_STD_PRAGMA
-#define BCOM_GEN_RX_BD_PRAGMA  BCOM_STD_PRAGMA
-#define BCOM_GEN_TX_BD_PRAGMA  BCOM_STD_PRAGMA
-#define BCOM_GEN_LPC_PRAGMA    BCOM_STD_PRAGMA
-#define BCOM_PCI_RX_PRAGMA     BCOM_PCI_PRAGMA
-#define BCOM_PCI_TX_PRAGMA     BCOM_PCI_PRAGMA
-
-/* Initiators number */
-#define BCOM_INITIATOR_ALWAYS   0
-#define BCOM_INITIATOR_SCTMR_0  1
-#define BCOM_INITIATOR_SCTMR_1  2
-#define BCOM_INITIATOR_FEC_RX   3
-#define BCOM_INITIATOR_FEC_TX   4
-#define BCOM_INITIATOR_ATA_RX   5
-#define BCOM_INITIATOR_ATA_TX   6
-#define BCOM_INITIATOR_SCPCI_RX         7
-#define BCOM_INITIATOR_SCPCI_TX         8
-#define BCOM_INITIATOR_PSC3_RX  9
-#define BCOM_INITIATOR_PSC3_TX 10
-#define BCOM_INITIATOR_PSC2_RX 11
-#define BCOM_INITIATOR_PSC2_TX 12
-#define BCOM_INITIATOR_PSC1_RX 13
-#define BCOM_INITIATOR_PSC1_TX 14
-#define BCOM_INITIATOR_SCTMR_2 15
-#define BCOM_INITIATOR_SCLPC   16
-#define BCOM_INITIATOR_PSC5_RX 17
-#define BCOM_INITIATOR_PSC5_TX 18
-#define BCOM_INITIATOR_PSC4_RX 19
-#define BCOM_INITIATOR_PSC4_TX 20
-#define BCOM_INITIATOR_I2C2_RX 21
-#define BCOM_INITIATOR_I2C2_TX 22
-#define BCOM_INITIATOR_I2C1_RX 23
-#define BCOM_INITIATOR_I2C1_TX 24
-#define BCOM_INITIATOR_PSC6_RX 25
-#define BCOM_INITIATOR_PSC6_TX 26
-#define BCOM_INITIATOR_IRDA_RX 25
-#define BCOM_INITIATOR_IRDA_TX 26
-#define BCOM_INITIATOR_SCTMR_3 27
-#define BCOM_INITIATOR_SCTMR_4 28
-#define BCOM_INITIATOR_SCTMR_5 29
-#define BCOM_INITIATOR_SCTMR_6 30
-#define BCOM_INITIATOR_SCTMR_7 31
-
-/* Initiators priorities */
-#define BCOM_IPR_ALWAYS                7
-#define BCOM_IPR_SCTMR_0       2
-#define BCOM_IPR_SCTMR_1       2
-#define BCOM_IPR_FEC_RX                6
-#define BCOM_IPR_FEC_TX                5
-#define BCOM_IPR_ATA_RX                7
-#define BCOM_IPR_ATA_TX                7
-#define BCOM_IPR_SCPCI_RX      2
-#define BCOM_IPR_SCPCI_TX      2
-#define BCOM_IPR_PSC3_RX       2
-#define BCOM_IPR_PSC3_TX       2
-#define BCOM_IPR_PSC2_RX       2
-#define BCOM_IPR_PSC2_TX       2
-#define BCOM_IPR_PSC1_RX       2
-#define BCOM_IPR_PSC1_TX       2
-#define BCOM_IPR_SCTMR_2       2
-#define BCOM_IPR_SCLPC         2
-#define BCOM_IPR_PSC5_RX       2
-#define BCOM_IPR_PSC5_TX       2
-#define BCOM_IPR_PSC4_RX       2
-#define BCOM_IPR_PSC4_TX       2
-#define BCOM_IPR_I2C2_RX       2
-#define BCOM_IPR_I2C2_TX       2
-#define BCOM_IPR_I2C1_RX       2
-#define BCOM_IPR_I2C1_TX       2
-#define BCOM_IPR_PSC6_RX       2
-#define BCOM_IPR_PSC6_TX       2
-#define BCOM_IPR_IRDA_RX       2
-#define BCOM_IPR_IRDA_TX       2
-#define BCOM_IPR_SCTMR_3       2
-#define BCOM_IPR_SCTMR_4       2
-#define BCOM_IPR_SCTMR_5       2
-#define BCOM_IPR_SCTMR_6       2
-#define BCOM_IPR_SCTMR_7       2
-
-
-/* ======================================================================== */
-/* API                                                                      */
-/* ======================================================================== */
-
-extern struct bcom_task *bcom_task_alloc(int bd_count, int bd_size, int priv_size);
-extern void bcom_task_free(struct bcom_task *tsk);
-extern int bcom_load_image(int task, u32 *task_image);
-extern void bcom_set_initiator(int task, int initiator);
-
-
-#define TASK_ENABLE             0x8000
-
-/**
- * bcom_disable_prefetch - Hook to disable bus prefetching
- *
- * ATA DMA and the original MPC5200 need this due to silicon bugs.  At the
- * moment disabling prefetch is a one-way street.  There is no mechanism
- * in place to turn prefetch back on after it has been disabled.  There is
- * no reason it couldn't be done, it would just be more complex to implement.
- */
-static inline void bcom_disable_prefetch(void)
-{
-       u16 regval;
-
-       regval = in_be16(&bcom_eng->regs->PtdCntrl);
-       out_be16(&bcom_eng->regs->PtdCntrl, regval | 1);
-};
-
-static inline void
-bcom_enable_task(int task)
-{
-        u16 reg;
-        reg = in_be16(&bcom_eng->regs->tcr[task]);
-        out_be16(&bcom_eng->regs->tcr[task],  reg | TASK_ENABLE);
-}
-
-static inline void
-bcom_disable_task(int task)
-{
-        u16 reg = in_be16(&bcom_eng->regs->tcr[task]);
-        out_be16(&bcom_eng->regs->tcr[task], reg & ~TASK_ENABLE);
-}
-
-
-static inline u32 *
-bcom_task_desc(int task)
-{
-       return bcom_sram_pa2va(bcom_eng->tdt[task].start);
-}
-
-static inline int
-bcom_task_num_descs(int task)
-{
-       return (bcom_eng->tdt[task].stop - bcom_eng->tdt[task].start)/sizeof(u32) + 1;
-}
-
-static inline u32 *
-bcom_task_var(int task)
-{
-       return bcom_sram_pa2va(bcom_eng->tdt[task].var);
-}
-
-static inline u32 *
-bcom_task_inc(int task)
-{
-       return &bcom_task_var(task)[BCOM_MAX_VAR];
-}
-
-
-static inline int
-bcom_drd_is_extended(u32 desc)
-{
-       return (desc) & BCOM_DRD_EXTENDED;
-}
-
-static inline int
-bcom_desc_is_drd(u32 desc)
-{
-       return !(desc & BCOM_LCD_MASK) && desc != BCOM_DESC_NOP;
-}
-
-static inline int
-bcom_desc_initiator(u32 desc)
-{
-       return (desc >> BCOM_DRD_INITIATOR_SHIFT) & 0x1f;
-}
-
-static inline void
-bcom_set_desc_initiator(u32 *desc, int initiator)
-{
-       *desc = (*desc & ~(0x1f << BCOM_DRD_INITIATOR_SHIFT)) |
-                       ((initiator & 0x1f) << BCOM_DRD_INITIATOR_SHIFT);
-}
-
-
-static inline void
-bcom_set_task_pragma(int task, int pragma)
-{
-       u32 *fdt = &bcom_eng->tdt[task].fdt;
-       *fdt = (*fdt & ~0xff) | pragma;
-}
-
-static inline void
-bcom_set_task_auto_start(int task, int next_task)
-{
-       u16 __iomem *tcr = &bcom_eng->regs->tcr[task];
-       out_be16(tcr, (in_be16(tcr) & ~0xff) | 0x00c0 | next_task);
-}
-
-static inline void
-bcom_set_tcr_initiator(int task, int initiator)
-{
-       u16 __iomem *tcr = &bcom_eng->regs->tcr[task];
-       out_be16(tcr, (in_be16(tcr) & ~0x1f00) | ((initiator & 0x1f) << 8));
-}
-
-
-#endif /* __BESTCOMM_PRIV_H__ */
-
diff --git a/arch/powerpc/sysdev/bestcomm/fec.c b/arch/powerpc/sysdev/bestcomm/fec.c
deleted file mode 100644 (file)
index 957a988..0000000
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * Bestcomm FEC tasks driver
- *
- *
- * Copyright (C) 2006-2007 Sylvain Munaut <tnt@246tNt.com>
- * Copyright (C) 2003-2004 MontaVista, Software, Inc.
- *                         ( by Dale Farnsworth <dfarnsworth@mvista.com> )
- *
- * This file is licensed under the terms of the GNU General Public License
- * version 2. This program is licensed "as is" without any warranty of any
- * kind, whether express or implied.
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/types.h>
-#include <asm/io.h>
-
-#include "bestcomm.h"
-#include "bestcomm_priv.h"
-#include "fec.h"
-
-
-/* ======================================================================== */
-/* Task image/var/inc                                                       */
-/* ======================================================================== */
-
-/* fec tasks images */
-extern u32 bcom_fec_rx_task[];
-extern u32 bcom_fec_tx_task[];
-
-/* rx task vars that need to be set before enabling the task */
-struct bcom_fec_rx_var {
-       u32 enable;             /* (u16*) address of task's control register */
-       u32 fifo;               /* (u32*) address of fec's fifo */
-       u32 bd_base;            /* (struct bcom_bd*) beginning of ring buffer */
-       u32 bd_last;            /* (struct bcom_bd*) end of ring buffer */
-       u32 bd_start;           /* (struct bcom_bd*) current bd */
-       u32 buffer_size;        /* size of receive buffer */
-};
-
-/* rx task incs that need to be set before enabling the task */
-struct bcom_fec_rx_inc {
-       u16 pad0;
-       s16 incr_bytes;
-       u16 pad1;
-       s16 incr_dst;
-       u16 pad2;
-       s16 incr_dst_ma;
-};
-
-/* tx task vars that need to be set before enabling the task */
-struct bcom_fec_tx_var {
-       u32 DRD;                /* (u32*) address of self-modified DRD */
-       u32 fifo;               /* (u32*) address of fec's fifo */
-       u32 enable;             /* (u16*) address of task's control register */
-       u32 bd_base;            /* (struct bcom_bd*) beginning of ring buffer */
-       u32 bd_last;            /* (struct bcom_bd*) end of ring buffer */
-       u32 bd_start;           /* (struct bcom_bd*) current bd */
-       u32 buffer_size;        /* set by uCode for each packet */
-};
-
-/* tx task incs that need to be set before enabling the task */
-struct bcom_fec_tx_inc {
-       u16 pad0;
-       s16 incr_bytes;
-       u16 pad1;
-       s16 incr_src;
-       u16 pad2;
-       s16 incr_src_ma;
-};
-
-/* private structure in the task */
-struct bcom_fec_priv {
-       phys_addr_t     fifo;
-       int             maxbufsize;
-};
-
-
-/* ======================================================================== */
-/* Task support code                                                        */
-/* ======================================================================== */
-
-struct bcom_task *
-bcom_fec_rx_init(int queue_len, phys_addr_t fifo, int maxbufsize)
-{
-       struct bcom_task *tsk;
-       struct bcom_fec_priv *priv;
-
-       tsk = bcom_task_alloc(queue_len, sizeof(struct bcom_fec_bd),
-                               sizeof(struct bcom_fec_priv));
-       if (!tsk)
-               return NULL;
-
-       tsk->flags = BCOM_FLAGS_NONE;
-
-       priv = tsk->priv;
-       priv->fifo = fifo;
-       priv->maxbufsize = maxbufsize;
-
-       if (bcom_fec_rx_reset(tsk)) {
-               bcom_task_free(tsk);
-               return NULL;
-       }
-
-       return tsk;
-}
-EXPORT_SYMBOL_GPL(bcom_fec_rx_init);
-
-int
-bcom_fec_rx_reset(struct bcom_task *tsk)
-{
-       struct bcom_fec_priv *priv = tsk->priv;
-       struct bcom_fec_rx_var *var;
-       struct bcom_fec_rx_inc *inc;
-
-       /* Shutdown the task */
-       bcom_disable_task(tsk->tasknum);
-
-       /* Reset the microcode */
-       var = (struct bcom_fec_rx_var *) bcom_task_var(tsk->tasknum);
-       inc = (struct bcom_fec_rx_inc *) bcom_task_inc(tsk->tasknum);
-
-       if (bcom_load_image(tsk->tasknum, bcom_fec_rx_task))
-               return -1;
-
-       var->enable     = bcom_eng->regs_base +
-                               offsetof(struct mpc52xx_sdma, tcr[tsk->tasknum]);
-       var->fifo       = (u32) priv->fifo;
-       var->bd_base    = tsk->bd_pa;
-       var->bd_last    = tsk->bd_pa + ((tsk->num_bd-1) * tsk->bd_size);
-       var->bd_start   = tsk->bd_pa;
-       var->buffer_size = priv->maxbufsize;
-
-       inc->incr_bytes = -(s16)sizeof(u32);    /* These should be in the   */
-       inc->incr_dst   = sizeof(u32);          /* task image, but we stick */
-       inc->incr_dst_ma= sizeof(u8);           /* to the official ones     */
-
-       /* Reset the BDs */
-       tsk->index = 0;
-       tsk->outdex = 0;
-
-       memset(tsk->bd, 0x00, tsk->num_bd * tsk->bd_size);
-
-       /* Configure some stuff */
-       bcom_set_task_pragma(tsk->tasknum, BCOM_FEC_RX_BD_PRAGMA);
-       bcom_set_task_auto_start(tsk->tasknum, tsk->tasknum);
-
-       out_8(&bcom_eng->regs->ipr[BCOM_INITIATOR_FEC_RX], BCOM_IPR_FEC_RX);
-
-       out_be32(&bcom_eng->regs->IntPend, 1<<tsk->tasknum);    /* Clear ints */
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(bcom_fec_rx_reset);
-
-void
-bcom_fec_rx_release(struct bcom_task *tsk)
-{
-       /* Nothing special for the FEC tasks */
-       bcom_task_free(tsk);
-}
-EXPORT_SYMBOL_GPL(bcom_fec_rx_release);
-
-
-
-       /* Return 2nd to last DRD */
-       /* This is an ugly hack, but at least it's only done
-          once at initialization */
-static u32 *self_modified_drd(int tasknum)
-{
-       u32 *desc;
-       int num_descs;
-       int drd_count;
-       int i;
-
-       num_descs = bcom_task_num_descs(tasknum);
-       desc = bcom_task_desc(tasknum) + num_descs - 1;
-       drd_count = 0;
-       for (i=0; i<num_descs; i++, desc--)
-               if (bcom_desc_is_drd(*desc) && ++drd_count == 3)
-                       break;
-       return desc;
-}
-
-struct bcom_task *
-bcom_fec_tx_init(int queue_len, phys_addr_t fifo)
-{
-       struct bcom_task *tsk;
-       struct bcom_fec_priv *priv;
-
-       tsk = bcom_task_alloc(queue_len, sizeof(struct bcom_fec_bd),
-                               sizeof(struct bcom_fec_priv));
-       if (!tsk)
-               return NULL;
-
-       tsk->flags = BCOM_FLAGS_ENABLE_TASK;
-
-       priv = tsk->priv;
-       priv->fifo = fifo;
-
-       if (bcom_fec_tx_reset(tsk)) {
-               bcom_task_free(tsk);
-               return NULL;
-       }
-
-       return tsk;
-}
-EXPORT_SYMBOL_GPL(bcom_fec_tx_init);
-
-int
-bcom_fec_tx_reset(struct bcom_task *tsk)
-{
-       struct bcom_fec_priv *priv = tsk->priv;
-       struct bcom_fec_tx_var *var;
-       struct bcom_fec_tx_inc *inc;
-
-       /* Shutdown the task */
-       bcom_disable_task(tsk->tasknum);
-
-       /* Reset the microcode */
-       var = (struct bcom_fec_tx_var *) bcom_task_var(tsk->tasknum);
-       inc = (struct bcom_fec_tx_inc *) bcom_task_inc(tsk->tasknum);
-
-       if (bcom_load_image(tsk->tasknum, bcom_fec_tx_task))
-               return -1;
-
-       var->enable     = bcom_eng->regs_base +
-                               offsetof(struct mpc52xx_sdma, tcr[tsk->tasknum]);
-       var->fifo       = (u32) priv->fifo;
-       var->DRD        = bcom_sram_va2pa(self_modified_drd(tsk->tasknum));
-       var->bd_base    = tsk->bd_pa;
-       var->bd_last    = tsk->bd_pa + ((tsk->num_bd-1) * tsk->bd_size);
-       var->bd_start   = tsk->bd_pa;
-
-       inc->incr_bytes = -(s16)sizeof(u32);    /* These should be in the   */
-       inc->incr_src   = sizeof(u32);          /* task image, but we stick */
-       inc->incr_src_ma= sizeof(u8);           /* to the official ones     */
-
-       /* Reset the BDs */
-       tsk->index = 0;
-       tsk->outdex = 0;
-
-       memset(tsk->bd, 0x00, tsk->num_bd * tsk->bd_size);
-
-       /* Configure some stuff */
-       bcom_set_task_pragma(tsk->tasknum, BCOM_FEC_TX_BD_PRAGMA);
-       bcom_set_task_auto_start(tsk->tasknum, tsk->tasknum);
-
-       out_8(&bcom_eng->regs->ipr[BCOM_INITIATOR_FEC_TX], BCOM_IPR_FEC_TX);
-
-       out_be32(&bcom_eng->regs->IntPend, 1<<tsk->tasknum);    /* Clear ints */
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(bcom_fec_tx_reset);
-
-void
-bcom_fec_tx_release(struct bcom_task *tsk)
-{
-       /* Nothing special for the FEC tasks */
-       bcom_task_free(tsk);
-}
-EXPORT_SYMBOL_GPL(bcom_fec_tx_release);
-
-
-MODULE_DESCRIPTION("BestComm FEC tasks driver");
-MODULE_AUTHOR("Dale Farnsworth <dfarnsworth@mvista.com>");
-MODULE_LICENSE("GPL v2");
-
diff --git a/arch/powerpc/sysdev/bestcomm/fec.h b/arch/powerpc/sysdev/bestcomm/fec.h
deleted file mode 100644 (file)
index ee565d9..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Header for Bestcomm FEC tasks driver
- *
- *
- * Copyright (C) 2006-2007 Sylvain Munaut <tnt@246tNt.com>
- * Copyright (C) 2003-2004 MontaVista, Software, Inc.
- *                         ( by Dale Farnsworth <dfarnsworth@mvista.com> )
- *
- * This file is licensed under the terms of the GNU General Public License
- * version 2. This program is licensed "as is" without any warranty of any
- * kind, whether express or implied.
- */
-
-#ifndef __BESTCOMM_FEC_H__
-#define __BESTCOMM_FEC_H__
-
-
-struct bcom_fec_bd {
-       u32     status;
-       u32     skb_pa;
-};
-
-#define BCOM_FEC_TX_BD_TFD     0x08000000ul    /* transmit frame done */
-#define BCOM_FEC_TX_BD_TC      0x04000000ul    /* transmit CRC */
-#define BCOM_FEC_TX_BD_ABC     0x02000000ul    /* append bad CRC */
-
-#define BCOM_FEC_RX_BD_L       0x08000000ul    /* buffer is last in frame */
-#define BCOM_FEC_RX_BD_BC      0x00800000ul    /* DA is broadcast */
-#define BCOM_FEC_RX_BD_MC      0x00400000ul    /* DA is multicast and not broadcast */
-#define BCOM_FEC_RX_BD_LG      0x00200000ul    /* Rx frame length violation */
-#define BCOM_FEC_RX_BD_NO      0x00100000ul    /* Rx non-octet aligned frame */
-#define BCOM_FEC_RX_BD_CR      0x00040000ul    /* Rx CRC error */
-#define BCOM_FEC_RX_BD_OV      0x00020000ul    /* overrun */
-#define BCOM_FEC_RX_BD_TR      0x00010000ul    /* Rx frame truncated */
-#define BCOM_FEC_RX_BD_LEN_MASK        0x000007fful    /* mask for length of received frame */
-#define BCOM_FEC_RX_BD_ERRORS  (BCOM_FEC_RX_BD_LG | BCOM_FEC_RX_BD_NO | \
-               BCOM_FEC_RX_BD_CR | BCOM_FEC_RX_BD_OV | BCOM_FEC_RX_BD_TR)
-
-
-extern struct bcom_task *
-bcom_fec_rx_init(int queue_len, phys_addr_t fifo, int maxbufsize);
-
-extern int
-bcom_fec_rx_reset(struct bcom_task *tsk);
-
-extern void
-bcom_fec_rx_release(struct bcom_task *tsk);
-
-
-extern struct bcom_task *
-bcom_fec_tx_init(int queue_len, phys_addr_t fifo);
-
-extern int
-bcom_fec_tx_reset(struct bcom_task *tsk);
-
-extern void
-bcom_fec_tx_release(struct bcom_task *tsk);
-
-
-#endif /* __BESTCOMM_FEC_H__ */
-
diff --git a/arch/powerpc/sysdev/bestcomm/gen_bd.c b/arch/powerpc/sysdev/bestcomm/gen_bd.c
deleted file mode 100644 (file)
index e0a53e3..0000000
+++ /dev/null
@@ -1,354 +0,0 @@
-/*
- * Driver for MPC52xx processor BestComm General Buffer Descriptor
- *
- * Copyright (C) 2007 Sylvain Munaut <tnt@246tNt.com>
- * Copyright (C) 2006 AppSpec Computer Technologies Corp.
- *                    Jeff Gibbons <jeff.gibbons@appspec.com>
- *
- * 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.
- *
- */
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/types.h>
-#include <asm/errno.h>
-#include <asm/io.h>
-
-#include <asm/mpc52xx.h>
-#include <asm/mpc52xx_psc.h>
-
-#include "bestcomm.h"
-#include "bestcomm_priv.h"
-#include "gen_bd.h"
-
-
-/* ======================================================================== */
-/* Task image/var/inc                                                       */
-/* ======================================================================== */
-
-/* gen_bd tasks images */
-extern u32 bcom_gen_bd_rx_task[];
-extern u32 bcom_gen_bd_tx_task[];
-
-/* rx task vars that need to be set before enabling the task */
-struct bcom_gen_bd_rx_var {
-       u32 enable;             /* (u16*) address of task's control register */
-       u32 fifo;               /* (u32*) address of gen_bd's fifo */
-       u32 bd_base;            /* (struct bcom_bd*) beginning of ring buffer */
-       u32 bd_last;            /* (struct bcom_bd*) end of ring buffer */
-       u32 bd_start;           /* (struct bcom_bd*) current bd */
-       u32 buffer_size;        /* size of receive buffer */
-};
-
-/* rx task incs that need to be set before enabling the task */
-struct bcom_gen_bd_rx_inc {
-       u16 pad0;
-       s16 incr_bytes;
-       u16 pad1;
-       s16 incr_dst;
-};
-
-/* tx task vars that need to be set before enabling the task */
-struct bcom_gen_bd_tx_var {
-       u32 fifo;               /* (u32*) address of gen_bd's fifo */
-       u32 enable;             /* (u16*) address of task's control register */
-       u32 bd_base;            /* (struct bcom_bd*) beginning of ring buffer */
-       u32 bd_last;            /* (struct bcom_bd*) end of ring buffer */
-       u32 bd_start;           /* (struct bcom_bd*) current bd */
-       u32 buffer_size;        /* set by uCode for each packet */
-};
-
-/* tx task incs that need to be set before enabling the task */
-struct bcom_gen_bd_tx_inc {
-       u16 pad0;
-       s16 incr_bytes;
-       u16 pad1;
-       s16 incr_src;
-       u16 pad2;
-       s16 incr_src_ma;
-};
-
-/* private structure */
-struct bcom_gen_bd_priv {
-       phys_addr_t     fifo;
-       int             initiator;
-       int             ipr;
-       int             maxbufsize;
-};
-
-
-/* ======================================================================== */
-/* Task support code                                                        */
-/* ======================================================================== */
-
-struct bcom_task *
-bcom_gen_bd_rx_init(int queue_len, phys_addr_t fifo,
-                       int initiator, int ipr, int maxbufsize)
-{
-       struct bcom_task *tsk;
-       struct bcom_gen_bd_priv *priv;
-
-       tsk = bcom_task_alloc(queue_len, sizeof(struct bcom_gen_bd),
-                       sizeof(struct bcom_gen_bd_priv));
-       if (!tsk)
-               return NULL;
-
-       tsk->flags = BCOM_FLAGS_NONE;
-
-       priv = tsk->priv;
-       priv->fifo      = fifo;
-       priv->initiator = initiator;
-       priv->ipr       = ipr;
-       priv->maxbufsize = maxbufsize;
-
-       if (bcom_gen_bd_rx_reset(tsk)) {
-               bcom_task_free(tsk);
-               return NULL;
-       }
-
-       return tsk;
-}
-EXPORT_SYMBOL_GPL(bcom_gen_bd_rx_init);
-
-int
-bcom_gen_bd_rx_reset(struct bcom_task *tsk)
-{
-       struct bcom_gen_bd_priv *priv = tsk->priv;
-       struct bcom_gen_bd_rx_var *var;
-       struct bcom_gen_bd_rx_inc *inc;
-
-       /* Shutdown the task */
-       bcom_disable_task(tsk->tasknum);
-
-       /* Reset the microcode */
-       var = (struct bcom_gen_bd_rx_var *) bcom_task_var(tsk->tasknum);
-       inc = (struct bcom_gen_bd_rx_inc *) bcom_task_inc(tsk->tasknum);
-
-       if (bcom_load_image(tsk->tasknum, bcom_gen_bd_rx_task))
-               return -1;
-
-       var->enable     = bcom_eng->regs_base +
-                               offsetof(struct mpc52xx_sdma, tcr[tsk->tasknum]);
-       var->fifo       = (u32) priv->fifo;
-       var->bd_base    = tsk->bd_pa;
-       var->bd_last    = tsk->bd_pa + ((tsk->num_bd-1) * tsk->bd_size);
-       var->bd_start   = tsk->bd_pa;
-       var->buffer_size = priv->maxbufsize;
-
-       inc->incr_bytes = -(s16)sizeof(u32);
-       inc->incr_dst   = sizeof(u32);
-
-       /* Reset the BDs */
-       tsk->index = 0;
-       tsk->outdex = 0;
-
-       memset(tsk->bd, 0x00, tsk->num_bd * tsk->bd_size);
-
-       /* Configure some stuff */
-       bcom_set_task_pragma(tsk->tasknum, BCOM_GEN_RX_BD_PRAGMA);
-       bcom_set_task_auto_start(tsk->tasknum, tsk->tasknum);
-
-       out_8(&bcom_eng->regs->ipr[priv->initiator], priv->ipr);
-       bcom_set_initiator(tsk->tasknum, priv->initiator);
-
-       out_be32(&bcom_eng->regs->IntPend, 1<<tsk->tasknum);    /* Clear ints */
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(bcom_gen_bd_rx_reset);
-
-void
-bcom_gen_bd_rx_release(struct bcom_task *tsk)
-{
-       /* Nothing special for the GenBD tasks */
-       bcom_task_free(tsk);
-}
-EXPORT_SYMBOL_GPL(bcom_gen_bd_rx_release);
-
-
-extern struct bcom_task *
-bcom_gen_bd_tx_init(int queue_len, phys_addr_t fifo,
-                       int initiator, int ipr)
-{
-       struct bcom_task *tsk;
-       struct bcom_gen_bd_priv *priv;
-
-       tsk = bcom_task_alloc(queue_len, sizeof(struct bcom_gen_bd),
-                       sizeof(struct bcom_gen_bd_priv));
-       if (!tsk)
-               return NULL;
-
-       tsk->flags = BCOM_FLAGS_NONE;
-
-       priv = tsk->priv;
-       priv->fifo      = fifo;
-       priv->initiator = initiator;
-       priv->ipr       = ipr;
-
-       if (bcom_gen_bd_tx_reset(tsk)) {
-               bcom_task_free(tsk);
-               return NULL;
-       }
-
-       return tsk;
-}
-EXPORT_SYMBOL_GPL(bcom_gen_bd_tx_init);
-
-int
-bcom_gen_bd_tx_reset(struct bcom_task *tsk)
-{
-       struct bcom_gen_bd_priv *priv = tsk->priv;
-       struct bcom_gen_bd_tx_var *var;
-       struct bcom_gen_bd_tx_inc *inc;
-
-       /* Shutdown the task */
-       bcom_disable_task(tsk->tasknum);
-
-       /* Reset the microcode */
-       var = (struct bcom_gen_bd_tx_var *) bcom_task_var(tsk->tasknum);
-       inc = (struct bcom_gen_bd_tx_inc *) bcom_task_inc(tsk->tasknum);
-
-       if (bcom_load_image(tsk->tasknum, bcom_gen_bd_tx_task))
-               return -1;
-
-       var->enable     = bcom_eng->regs_base +
-                               offsetof(struct mpc52xx_sdma, tcr[tsk->tasknum]);
-       var->fifo       = (u32) priv->fifo;
-       var->bd_base    = tsk->bd_pa;
-       var->bd_last    = tsk->bd_pa + ((tsk->num_bd-1) * tsk->bd_size);
-       var->bd_start   = tsk->bd_pa;
-
-       inc->incr_bytes = -(s16)sizeof(u32);
-       inc->incr_src   = sizeof(u32);
-       inc->incr_src_ma = sizeof(u8);
-
-       /* Reset the BDs */
-       tsk->index = 0;
-       tsk->outdex = 0;
-
-       memset(tsk->bd, 0x00, tsk->num_bd * tsk->bd_size);
-
-       /* Configure some stuff */
-       bcom_set_task_pragma(tsk->tasknum, BCOM_GEN_TX_BD_PRAGMA);
-       bcom_set_task_auto_start(tsk->tasknum, tsk->tasknum);
-
-       out_8(&bcom_eng->regs->ipr[priv->initiator], priv->ipr);
-       bcom_set_initiator(tsk->tasknum, priv->initiator);
-
-       out_be32(&bcom_eng->regs->IntPend, 1<<tsk->tasknum);    /* Clear ints */
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(bcom_gen_bd_tx_reset);
-
-void
-bcom_gen_bd_tx_release(struct bcom_task *tsk)
-{
-       /* Nothing special for the GenBD tasks */
-       bcom_task_free(tsk);
-}
-EXPORT_SYMBOL_GPL(bcom_gen_bd_tx_release);
-
-/* ---------------------------------------------------------------------
- * PSC support code
- */
-
-/**
- * bcom_psc_parameters - Bestcomm initialization value table for PSC devices
- *
- * This structure is only used internally.  It is a lookup table for PSC
- * specific parameters to bestcomm tasks.
- */
-static struct bcom_psc_params {
-       int rx_initiator;
-       int rx_ipr;
-       int tx_initiator;
-       int tx_ipr;
-} bcom_psc_params[] = {
-       [0] = {
-               .rx_initiator = BCOM_INITIATOR_PSC1_RX,
-               .rx_ipr = BCOM_IPR_PSC1_RX,
-               .tx_initiator = BCOM_INITIATOR_PSC1_TX,
-               .tx_ipr = BCOM_IPR_PSC1_TX,
-       },
-       [1] = {
-               .rx_initiator = BCOM_INITIATOR_PSC2_RX,
-               .rx_ipr = BCOM_IPR_PSC2_RX,
-               .tx_initiator = BCOM_INITIATOR_PSC2_TX,
-               .tx_ipr = BCOM_IPR_PSC2_TX,
-       },
-       [2] = {
-               .rx_initiator = BCOM_INITIATOR_PSC3_RX,
-               .rx_ipr = BCOM_IPR_PSC3_RX,
-               .tx_initiator = BCOM_INITIATOR_PSC3_TX,
-               .tx_ipr = BCOM_IPR_PSC3_TX,
-       },
-       [3] = {
-               .rx_initiator = BCOM_INITIATOR_PSC4_RX,
-               .rx_ipr = BCOM_IPR_PSC4_RX,
-               .tx_initiator = BCOM_INITIATOR_PSC4_TX,
-               .tx_ipr = BCOM_IPR_PSC4_TX,
-       },
-       [4] = {
-               .rx_initiator = BCOM_INITIATOR_PSC5_RX,
-               .rx_ipr = BCOM_IPR_PSC5_RX,
-               .tx_initiator = BCOM_INITIATOR_PSC5_TX,
-               .tx_ipr = BCOM_IPR_PSC5_TX,
-       },
-       [5] = {
-               .rx_initiator = BCOM_INITIATOR_PSC6_RX,
-               .rx_ipr = BCOM_IPR_PSC6_RX,
-               .tx_initiator = BCOM_INITIATOR_PSC6_TX,
-               .tx_ipr = BCOM_IPR_PSC6_TX,
-       },
-};
-
-/**
- * bcom_psc_gen_bd_rx_init - Allocate a receive bcom_task for a PSC port
- * @psc_num:   Number of the PSC to allocate a task for
- * @queue_len: number of buffer descriptors to allocate for the task
- * @fifo:      physical address of FIFO register
- * @maxbufsize:        Maximum receive data size in bytes.
- *
- * Allocate a bestcomm task structure for receiving data from a PSC.
- */
-struct bcom_task * bcom_psc_gen_bd_rx_init(unsigned psc_num, int queue_len,
-                                          phys_addr_t fifo, int maxbufsize)
-{
-       if (psc_num >= MPC52xx_PSC_MAXNUM)
-               return NULL;
-
-       return bcom_gen_bd_rx_init(queue_len, fifo,
-                                  bcom_psc_params[psc_num].rx_initiator,
-                                  bcom_psc_params[psc_num].rx_ipr,
-                                  maxbufsize);
-}
-EXPORT_SYMBOL_GPL(bcom_psc_gen_bd_rx_init);
-
-/**
- * bcom_psc_gen_bd_tx_init - Allocate a transmit bcom_task for a PSC port
- * @psc_num:   Number of the PSC to allocate a task for
- * @queue_len: number of buffer descriptors to allocate for the task
- * @fifo:      physical address of FIFO register
- *
- * Allocate a bestcomm task structure for transmitting data to a PSC.
- */
-struct bcom_task *
-bcom_psc_gen_bd_tx_init(unsigned psc_num, int queue_len, phys_addr_t fifo)
-{
-       struct psc;
-       return bcom_gen_bd_tx_init(queue_len, fifo,
-                                  bcom_psc_params[psc_num].tx_initiator,
-                                  bcom_psc_params[psc_num].tx_ipr);
-}
-EXPORT_SYMBOL_GPL(bcom_psc_gen_bd_tx_init);
-
-
-MODULE_DESCRIPTION("BestComm General Buffer Descriptor tasks driver");
-MODULE_AUTHOR("Jeff Gibbons <jeff.gibbons@appspec.com>");
-MODULE_LICENSE("GPL v2");
-
diff --git a/arch/powerpc/sysdev/bestcomm/gen_bd.h b/arch/powerpc/sysdev/bestcomm/gen_bd.h
deleted file mode 100644 (file)
index de47260..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Header for Bestcomm General Buffer Descriptor tasks driver
- *
- *
- * Copyright (C) 2007 Sylvain Munaut <tnt@246tNt.com>
- * Copyright (C) 2006 AppSpec Computer Technologies Corp.
- *                    Jeff Gibbons <jeff.gibbons@appspec.com>
- *
- * 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.
- *
- *
- */
-
-#ifndef __BESTCOMM_GEN_BD_H__
-#define __BESTCOMM_GEN_BD_H__
-
-struct bcom_gen_bd {
-       u32     status;
-       u32     buf_pa;
-};
-
-
-extern struct bcom_task *
-bcom_gen_bd_rx_init(int queue_len, phys_addr_t fifo,
-                       int initiator, int ipr, int maxbufsize);
-
-extern int
-bcom_gen_bd_rx_reset(struct bcom_task *tsk);
-
-extern void
-bcom_gen_bd_rx_release(struct bcom_task *tsk);
-
-
-extern struct bcom_task *
-bcom_gen_bd_tx_init(int queue_len, phys_addr_t fifo,
-                       int initiator, int ipr);
-
-extern int
-bcom_gen_bd_tx_reset(struct bcom_task *tsk);
-
-extern void
-bcom_gen_bd_tx_release(struct bcom_task *tsk);
-
-
-/* PSC support utility wrappers */
-struct bcom_task * bcom_psc_gen_bd_rx_init(unsigned psc_num, int queue_len,
-                                          phys_addr_t fifo, int maxbufsize);
-struct bcom_task * bcom_psc_gen_bd_tx_init(unsigned psc_num, int queue_len,
-                                          phys_addr_t fifo);
-#endif  /* __BESTCOMM_GEN_BD_H__ */
-
diff --git a/arch/powerpc/sysdev/bestcomm/sram.c b/arch/powerpc/sysdev/bestcomm/sram.c
deleted file mode 100644 (file)
index b6db23e..0000000
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Simple memory allocator for on-board SRAM
- *
- *
- * Maintainer : Sylvain Munaut <tnt@246tNt.com>
- *
- * Copyright (C) 2005 Sylvain Munaut <tnt@246tNt.com>
- *
- * This file is licensed under the terms of the GNU General Public License
- * version 2. This program is licensed "as is" without any warranty of any
- * kind, whether express or implied.
- */
-
-#include <linux/err.h>
-#include <linux/kernel.h>
-#include <linux/export.h>
-#include <linux/slab.h>
-#include <linux/spinlock.h>
-#include <linux/string.h>
-#include <linux/ioport.h>
-#include <linux/of.h>
-
-#include <asm/io.h>
-#include <asm/mmu.h>
-
-#include "sram.h"
-
-
-/* Struct keeping our 'state' */
-struct bcom_sram *bcom_sram = NULL;
-EXPORT_SYMBOL_GPL(bcom_sram);  /* needed for inline functions */
-
-
-/* ======================================================================== */
-/* Public API                                                               */
-/* ======================================================================== */
-/* DO NOT USE in interrupts, if needed in irq handler, we should use the
-   _irqsave version of the spin_locks */
-
-int bcom_sram_init(struct device_node *sram_node, char *owner)
-{
-       int rv;
-       const u32 *regaddr_p;
-       u64 regaddr64, size64;
-       unsigned int psize;
-
-       /* Create our state struct */
-       if (bcom_sram) {
-               printk(KERN_ERR "%s: bcom_sram_init: "
-                       "Already initialized !\n", owner);
-               return -EBUSY;
-       }
-
-       bcom_sram = kmalloc(sizeof(struct bcom_sram), GFP_KERNEL);
-       if (!bcom_sram) {
-               printk(KERN_ERR "%s: bcom_sram_init: "
-                       "Couldn't allocate internal state !\n", owner);
-               return -ENOMEM;
-       }
-
-       /* Get address and size of the sram */
-       regaddr_p = of_get_address(sram_node, 0, &size64, NULL);
-       if (!regaddr_p) {
-               printk(KERN_ERR "%s: bcom_sram_init: "
-                       "Invalid device node !\n", owner);
-               rv = -EINVAL;
-               goto error_free;
-       }
-
-       regaddr64 = of_translate_address(sram_node, regaddr_p);
-
-       bcom_sram->base_phys = (phys_addr_t) regaddr64;
-       bcom_sram->size = (unsigned int) size64;
-
-       /* Request region */
-       if (!request_mem_region(bcom_sram->base_phys, bcom_sram->size, owner)) {
-               printk(KERN_ERR "%s: bcom_sram_init: "
-                       "Couldn't request region !\n", owner);
-               rv = -EBUSY;
-               goto error_free;
-       }
-
-       /* Map SRAM */
-               /* sram is not really __iomem */
-       bcom_sram->base_virt = (void*) ioremap(bcom_sram->base_phys, bcom_sram->size);
-
-       if (!bcom_sram->base_virt) {
-               printk(KERN_ERR "%s: bcom_sram_init: "
-                       "Map error SRAM zone 0x%08lx (0x%0x)!\n",
-                       owner, (long)bcom_sram->base_phys, bcom_sram->size );
-               rv = -ENOMEM;
-               goto error_release;
-       }
-
-       /* Create an rheap (defaults to 32 bits word alignment) */
-       bcom_sram->rh = rh_create(4);
-
-       /* Attach the free zones */
-#if 0
-       /* Currently disabled ... for future use only */
-       reg_addr_p = of_get_property(sram_node, "available", &psize);
-#else
-       regaddr_p = NULL;
-       psize = 0;
-#endif
-
-       if (!regaddr_p || !psize) {
-               /* Attach the whole zone */
-               rh_attach_region(bcom_sram->rh, 0, bcom_sram->size);
-       } else {
-               /* Attach each zone independently */
-               while (psize >= 2 * sizeof(u32)) {
-                       phys_addr_t zbase = of_translate_address(sram_node, regaddr_p);
-                       rh_attach_region(bcom_sram->rh, zbase - bcom_sram->base_phys, regaddr_p[1]);
-                       regaddr_p += 2;
-                       psize -= 2 * sizeof(u32);
-               }
-       }
-
-       /* Init our spinlock */
-       spin_lock_init(&bcom_sram->lock);
-
-       return 0;
-
-error_release:
-       release_mem_region(bcom_sram->base_phys, bcom_sram->size);
-error_free:
-       kfree(bcom_sram);
-       bcom_sram = NULL;
-
-       return rv;
-}
-EXPORT_SYMBOL_GPL(bcom_sram_init);
-
-void bcom_sram_cleanup(void)
-{
-       /* Free resources */
-       if (bcom_sram) {
-               rh_destroy(bcom_sram->rh);
-               iounmap((void __iomem *)bcom_sram->base_virt);
-               release_mem_region(bcom_sram->base_phys, bcom_sram->size);
-               kfree(bcom_sram);
-               bcom_sram = NULL;
-       }
-}
-EXPORT_SYMBOL_GPL(bcom_sram_cleanup);
-
-void* bcom_sram_alloc(int size, int align, phys_addr_t *phys)
-{
-       unsigned long offset;
-
-       spin_lock(&bcom_sram->lock);
-       offset = rh_alloc_align(bcom_sram->rh, size, align, NULL);
-       spin_unlock(&bcom_sram->lock);
-
-       if (IS_ERR_VALUE(offset))
-               return NULL;
-
-       *phys = bcom_sram->base_phys + offset;
-       return bcom_sram->base_virt + offset;
-}
-EXPORT_SYMBOL_GPL(bcom_sram_alloc);
-
-void bcom_sram_free(void *ptr)
-{
-       unsigned long offset;
-
-       if (!ptr)
-               return;
-
-       offset = ptr - bcom_sram->base_virt;
-
-       spin_lock(&bcom_sram->lock);
-       rh_free(bcom_sram->rh, offset);
-       spin_unlock(&bcom_sram->lock);
-}
-EXPORT_SYMBOL_GPL(bcom_sram_free);
-
diff --git a/arch/powerpc/sysdev/bestcomm/sram.h b/arch/powerpc/sysdev/bestcomm/sram.h
deleted file mode 100644 (file)
index b6d6689..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Handling of a sram zone for bestcomm
- *
- *
- * Copyright (C) 2007 Sylvain Munaut <tnt@246tNt.com>
- *
- * This file is licensed under the terms of the GNU General Public License
- * version 2. This program is licensed "as is" without any warranty of any
- * kind, whether express or implied.
- */
-
-#ifndef __BESTCOMM_SRAM_H__
-#define __BESTCOMM_SRAM_H__
-
-#include <asm/rheap.h>
-#include <asm/mmu.h>
-#include <linux/spinlock.h>
-
-
-/* Structure used internally */
-       /* The internals are here for the inline functions
-        * sake, certainly not for the user to mess with !
-        */
-struct bcom_sram {
-       phys_addr_t              base_phys;
-       void                    *base_virt;
-       unsigned int             size;
-       rh_info_t               *rh;
-       spinlock_t               lock;
-};
-
-extern struct bcom_sram *bcom_sram;
-
-
-/* Public API */
-extern int  bcom_sram_init(struct device_node *sram_node, char *owner);
-extern void bcom_sram_cleanup(void);
-
-extern void* bcom_sram_alloc(int size, int align, phys_addr_t *phys);
-extern void  bcom_sram_free(void *ptr);
-
-static inline phys_addr_t bcom_sram_va2pa(void *va) {
-       return bcom_sram->base_phys +
-               (unsigned long)(va - bcom_sram->base_virt);
-}
-
-static inline void *bcom_sram_pa2va(phys_addr_t pa) {
-       return bcom_sram->base_virt +
-               (unsigned long)(pa - bcom_sram->base_phys);
-}
-
-
-#endif  /* __BESTCOMM_SRAM_H__ */
-
index 96f815a55dfd289ec09797a2b329a197573cacea..5492dc5f56f4672adcff6d10e605aa91cc82bfca 100644 (file)
@@ -9,9 +9,9 @@
 #include <linux/kernel.h>
 #include <linux/of_platform.h>
 #include <linux/export.h>
+#include <asm/mpc5xxx.h>
 
-unsigned int
-mpc5xxx_get_bus_frequency(struct device_node *node)
+unsigned long mpc5xxx_get_bus_frequency(struct device_node *node)
 {
        struct device_node *np;
        const unsigned int *p_bus_freq = NULL;
index 7863b9fee50bbc33793a2acb2f104c34c22b2bd0..d8372ab2e4cf5614f448226ec423b13d167aa270 100644 (file)
@@ -29,7 +29,7 @@ obj-$(CONFIG_PNP)             += pnp/
 obj-y                          += amba/
 # Many drivers will want to use DMA so this has to be made available
 # really early.
-obj-$(CONFIG_DMA_ENGINE)       += dma/
+obj-$(CONFIG_DMADEVICES)       += dma/
 
 obj-$(CONFIG_VIRTIO)           += virtio/
 obj-$(CONFIG_XEN)              += xen/
index 652f57e8348466e51b476ec68c4c39ba9b5a5864..3a8fb28b71f28df9129277167703c96706b79d96 100644 (file)
@@ -26,9 +26,9 @@
 #include <asm/prom.h>
 #include <asm/mpc52xx.h>
 
-#include <sysdev/bestcomm/bestcomm.h>
-#include <sysdev/bestcomm/bestcomm_priv.h>
-#include <sysdev/bestcomm/ata.h>
+#include <linux/fsl/bestcomm/bestcomm.h>
+#include <linux/fsl/bestcomm/bestcomm_priv.h>
+#include <linux/fsl/bestcomm/ata.h>
 
 #define DRV_NAME       "mpc52xx_ata"
 
index d4c12180c65416043dbbf3940374ad146daad881..40179e749f08065d47d02c280608e16ca8411fc5 100644 (file)
@@ -125,6 +125,8 @@ config MPC512X_DMA
        ---help---
          Enable support for the Freescale MPC512x built-in DMA engine.
 
+source "drivers/dma/bestcomm/Kconfig"
+
 config MV_XOR
        bool "Marvell XOR engine support"
        depends on PLAT_ORION
index 7428feaa8705393e13a7425ea5259dc8eabd4d30..642d96736cf522c2d3960936515fd632b07e405f 100644 (file)
@@ -10,6 +10,7 @@ obj-$(CONFIG_INTEL_IOATDMA) += ioat/
 obj-$(CONFIG_INTEL_IOP_ADMA) += iop-adma.o
 obj-$(CONFIG_FSL_DMA) += fsldma.o
 obj-$(CONFIG_MPC512X_DMA) += mpc512x_dma.o
+obj-$(CONFIG_PPC_BESTCOMM) += bestcomm/
 obj-$(CONFIG_MV_XOR) += mv_xor.o
 obj-$(CONFIG_DW_DMAC) += dw_dmac.o
 obj-$(CONFIG_AT_HDMAC) += at_hdmac.o
diff --git a/drivers/dma/bestcomm/Kconfig b/drivers/dma/bestcomm/Kconfig
new file mode 100644 (file)
index 0000000..29e4270
--- /dev/null
@@ -0,0 +1,36 @@
+#
+# Kconfig options for Bestcomm
+#
+
+config PPC_BESTCOMM
+       tristate "Bestcomm DMA engine support"
+       depends on PPC_MPC52xx
+       default n
+       select PPC_LIB_RHEAP
+       help
+         BestComm is the name of the communication coprocessor found
+         on the Freescale MPC5200 family of processor.  Its usage is
+         optional for some drivers (like ATA), but required for
+         others (like FEC).
+
+         If you want to use drivers that require DMA operations,
+         answer Y or M. Otherwise say N.
+
+config PPC_BESTCOMM_ATA
+       tristate
+       depends on PPC_BESTCOMM
+       help
+         This option enables the support for the ATA task.
+
+config PPC_BESTCOMM_FEC
+       tristate
+       depends on PPC_BESTCOMM
+       help
+         This option enables the support for the FEC tasks.
+
+config PPC_BESTCOMM_GEN_BD
+       tristate
+       depends on PPC_BESTCOMM
+       help
+         This option enables the support for the GenBD tasks.
+
diff --git a/drivers/dma/bestcomm/Makefile b/drivers/dma/bestcomm/Makefile
new file mode 100644 (file)
index 0000000..aed2df2
--- /dev/null
@@ -0,0 +1,14 @@
+#
+# Makefile for BestComm & co
+#
+
+bestcomm-core-objs     := bestcomm.o sram.o
+bestcomm-ata-objs      := ata.o bcom_ata_task.o
+bestcomm-fec-objs      := fec.o bcom_fec_rx_task.o bcom_fec_tx_task.o
+bestcomm-gen-bd-objs   := gen_bd.o bcom_gen_bd_rx_task.o bcom_gen_bd_tx_task.o
+
+obj-$(CONFIG_PPC_BESTCOMM)             += bestcomm-core.o
+obj-$(CONFIG_PPC_BESTCOMM_ATA)         += bestcomm-ata.o
+obj-$(CONFIG_PPC_BESTCOMM_FEC)         += bestcomm-fec.o
+obj-$(CONFIG_PPC_BESTCOMM_GEN_BD)      += bestcomm-gen-bd.o
diff --git a/drivers/dma/bestcomm/ata.c b/drivers/dma/bestcomm/ata.c
new file mode 100644 (file)
index 0000000..2fd87f8
--- /dev/null
@@ -0,0 +1,157 @@
+/*
+ * Bestcomm ATA task driver
+ *
+ *
+ * Patterned after bestcomm/fec.c by Dale Farnsworth <dfarnsworth@mvista.com>
+ *                                   2003-2004 (c) MontaVista, Software, Inc.
+ *
+ * Copyright (C) 2006-2007 Sylvain Munaut <tnt@246tNt.com>
+ * Copyright (C) 2006      Freescale - John Rigby
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/types.h>
+#include <asm/io.h>
+
+#include <linux/fsl/bestcomm/bestcomm.h>
+#include <linux/fsl/bestcomm/bestcomm_priv.h>
+#include <linux/fsl/bestcomm/ata.h>
+
+
+/* ======================================================================== */
+/* Task image/var/inc                                                       */
+/* ======================================================================== */
+
+/* ata task image */
+extern u32 bcom_ata_task[];
+
+/* ata task vars that need to be set before enabling the task */
+struct bcom_ata_var {
+       u32 enable;             /* (u16*) address of task's control register */
+       u32 bd_base;            /* (struct bcom_bd*) beginning of ring buffer */
+       u32 bd_last;            /* (struct bcom_bd*) end of ring buffer */
+       u32 bd_start;           /* (struct bcom_bd*) current bd */
+       u32 buffer_size;        /* size of receive buffer */
+};
+
+/* ata task incs that need to be set before enabling the task */
+struct bcom_ata_inc {
+       u16 pad0;
+       s16 incr_bytes;
+       u16 pad1;
+       s16 incr_dst;
+       u16 pad2;
+       s16 incr_src;
+};
+
+
+/* ======================================================================== */
+/* Task support code                                                        */
+/* ======================================================================== */
+
+struct bcom_task *
+bcom_ata_init(int queue_len, int maxbufsize)
+{
+       struct bcom_task *tsk;
+       struct bcom_ata_var *var;
+       struct bcom_ata_inc *inc;
+
+       /* Prefetch breaks ATA DMA.  Turn it off for ATA DMA */
+       bcom_disable_prefetch();
+
+       tsk = bcom_task_alloc(queue_len, sizeof(struct bcom_ata_bd), 0);
+       if (!tsk)
+               return NULL;
+
+       tsk->flags = BCOM_FLAGS_NONE;
+
+       bcom_ata_reset_bd(tsk);
+
+       var = (struct bcom_ata_var *) bcom_task_var(tsk->tasknum);
+       inc = (struct bcom_ata_inc *) bcom_task_inc(tsk->tasknum);
+
+       if (bcom_load_image(tsk->tasknum, bcom_ata_task)) {
+               bcom_task_free(tsk);
+               return NULL;
+       }
+
+       var->enable     = bcom_eng->regs_base +
+                               offsetof(struct mpc52xx_sdma, tcr[tsk->tasknum]);
+       var->bd_base    = tsk->bd_pa;
+       var->bd_last    = tsk->bd_pa + ((tsk->num_bd-1) * tsk->bd_size);
+       var->bd_start   = tsk->bd_pa;
+       var->buffer_size = maxbufsize;
+
+       /* Configure some stuff */
+       bcom_set_task_pragma(tsk->tasknum, BCOM_ATA_PRAGMA);
+       bcom_set_task_auto_start(tsk->tasknum, tsk->tasknum);
+
+       out_8(&bcom_eng->regs->ipr[BCOM_INITIATOR_ATA_RX], BCOM_IPR_ATA_RX);
+       out_8(&bcom_eng->regs->ipr[BCOM_INITIATOR_ATA_TX], BCOM_IPR_ATA_TX);
+
+       out_be32(&bcom_eng->regs->IntPend, 1<<tsk->tasknum); /* Clear ints */
+
+       return tsk;
+}
+EXPORT_SYMBOL_GPL(bcom_ata_init);
+
+void bcom_ata_rx_prepare(struct bcom_task *tsk)
+{
+       struct bcom_ata_inc *inc;
+
+       inc = (struct bcom_ata_inc *) bcom_task_inc(tsk->tasknum);
+
+       inc->incr_bytes = -(s16)sizeof(u32);
+       inc->incr_src   = 0;
+       inc->incr_dst   = sizeof(u32);
+
+       bcom_set_initiator(tsk->tasknum, BCOM_INITIATOR_ATA_RX);
+}
+EXPORT_SYMBOL_GPL(bcom_ata_rx_prepare);
+
+void bcom_ata_tx_prepare(struct bcom_task *tsk)
+{
+       struct bcom_ata_inc *inc;
+
+       inc = (struct bcom_ata_inc *) bcom_task_inc(tsk->tasknum);
+
+       inc->incr_bytes = -(s16)sizeof(u32);
+       inc->incr_src   = sizeof(u32);
+       inc->incr_dst   = 0;
+
+       bcom_set_initiator(tsk->tasknum, BCOM_INITIATOR_ATA_TX);
+}
+EXPORT_SYMBOL_GPL(bcom_ata_tx_prepare);
+
+void bcom_ata_reset_bd(struct bcom_task *tsk)
+{
+       struct bcom_ata_var *var;
+
+       /* Reset all BD */
+       memset(tsk->bd, 0x00, tsk->num_bd * tsk->bd_size);
+
+       tsk->index = 0;
+       tsk->outdex = 0;
+
+       var = (struct bcom_ata_var *) bcom_task_var(tsk->tasknum);
+       var->bd_start = var->bd_base;
+}
+EXPORT_SYMBOL_GPL(bcom_ata_reset_bd);
+
+void bcom_ata_release(struct bcom_task *tsk)
+{
+       /* Nothing special for the ATA tasks */
+       bcom_task_free(tsk);
+}
+EXPORT_SYMBOL_GPL(bcom_ata_release);
+
+
+MODULE_DESCRIPTION("BestComm ATA task driver");
+MODULE_AUTHOR("John Rigby");
+MODULE_LICENSE("GPL v2");
+
diff --git a/drivers/dma/bestcomm/bcom_ata_task.c b/drivers/dma/bestcomm/bcom_ata_task.c
new file mode 100644 (file)
index 0000000..cc6049a
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Bestcomm ATA task microcode
+ *
+ * Copyright (c) 2004 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 version 2 as published
+ * by the Free Software Foundation.
+ *
+ * Created based on bestcom/code_dma/image_rtos1/dma_image.hex
+ */
+
+#include <asm/types.h>
+
+/*
+ * The header consists of the following fields:
+ *     u32     magic;
+ *     u8      desc_size;
+ *     u8      var_size;
+ *     u8      inc_size;
+ *     u8      first_var;
+ *     u8      reserved[8];
+ *
+ * The size fields contain the number of 32-bit words.
+ */
+
+u32 bcom_ata_task[] = {
+       /* header */
+       0x4243544b,
+       0x0e060709,
+       0x00000000,
+       0x00000000,
+
+       /* Task descriptors */
+       0x8198009b, /* LCD: idx0 = var3; idx0 <= var2; idx0 += inc3 */
+       0x13e00c08, /*   DRD1A: var3 = var1; FN=0 MORE init=31 WS=0 RS=0 */
+       0xb8000264, /*   LCD: idx1 = *idx0, idx2 = var0; idx1 < var9; idx1 += inc4, idx2 += inc4 */
+       0x10000f00, /*     DRD1A: var3 = idx0; FN=0 MORE init=0 WS=0 RS=0 */
+       0x60140002, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT init=0 WS=2 RS=2 */
+       0x0c8cfc8a, /*     DRD2B1: *idx2 = EU3(); EU3(*idx2,var10)  */
+       0xd8988240, /*   LCDEXT: idx1 = idx1; idx1 > var9; idx1 += inc0 */
+       0xf845e011, /*   LCDEXT: idx2 = *(idx0 + var00000015); ; idx2 += inc2 */
+       0xb845e00a, /*   LCD: idx3 = *(idx0 + var00000019); ; idx3 += inc1 */
+       0x0bfecf90, /*     DRD1A: *idx3 = *idx2; FN=0 TFD init=31 WS=3 RS=3 */
+       0x9898802d, /*   LCD: idx1 = idx1; idx1 once var0; idx1 += inc5 */
+       0x64000005, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=5 INT EXT init=0 WS=0 RS=0 */
+       0x0c0cf849, /*     DRD2B1: *idx0 = EU3(); EU3(idx1,var9)  */
+       0x000001f8, /* NOP */
+
+       /* VAR[9]-VAR[14] */
+       0x40000000,
+       0x7fff7fff,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+
+       /* INC[0]-INC[6] */
+       0x40000000,
+       0xe0000000,
+       0xe0000000,
+       0xa000000c,
+       0x20000000,
+       0x00000000,
+       0x00000000,
+};
+
diff --git a/drivers/dma/bestcomm/bcom_fec_rx_task.c b/drivers/dma/bestcomm/bcom_fec_rx_task.c
new file mode 100644 (file)
index 0000000..a1ad6a0
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * Bestcomm FEC RX task microcode
+ *
+ * Copyright (c) 2004 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 version 2 as published
+ * by the Free Software Foundation.
+ *
+ * Automatically created based on BestCommAPI-2.2/code_dma/image_rtos1/dma_image.hex
+ * on Tue Mar 22 11:19:38 2005 GMT
+ */
+
+#include <asm/types.h>
+
+/*
+ * The header consists of the following fields:
+ *     u32     magic;
+ *     u8      desc_size;
+ *     u8      var_size;
+ *     u8      inc_size;
+ *     u8      first_var;
+ *     u8      reserved[8];
+ *
+ * The size fields contain the number of 32-bit words.
+ */
+
+u32 bcom_fec_rx_task[] = {
+       /* header */
+       0x4243544b,
+       0x18060709,
+       0x00000000,
+       0x00000000,
+
+       /* Task descriptors */
+       0x808220e3, /* LCD: idx0 = var1, idx1 = var4; idx1 <= var3; idx0 += inc4, idx1 += inc3 */
+       0x10601010, /*   DRD1A: var4 = var2; FN=0 MORE init=3 WS=0 RS=0 */
+       0xb8800264, /*   LCD: idx2 = *idx1, idx3 = var0; idx2 < var9; idx2 += inc4, idx3 += inc4 */
+       0x10001308, /*     DRD1A: var4 = idx1; FN=0 MORE init=0 WS=0 RS=0 */
+       0x60140002, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT init=0 WS=2 RS=2 */
+       0x0cccfcca, /*     DRD2B1: *idx3 = EU3(); EU3(*idx3,var10)  */
+       0x80004000, /*   LCDEXT: idx2 = 0x00000000; ; */
+       0xb8c58029, /*   LCD: idx3 = *(idx1 + var00000015); idx3 once var0; idx3 += inc5 */
+       0x60000002, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT init=0 WS=0 RS=0 */
+       0x088cf8cc, /*     DRD2B1: idx2 = EU3(); EU3(idx3,var12)  */
+       0x991982f2, /*   LCD: idx2 = idx2, idx3 = idx3; idx2 > var11; idx2 += inc6, idx3 += inc2 */
+       0x006acf80, /*     DRD1A: *idx3 = *idx0; FN=0 init=3 WS=1 RS=1 */
+       0x80004000, /*   LCDEXT: idx2 = 0x00000000; ; */
+       0x9999802d, /*   LCD: idx3 = idx3; idx3 once var0; idx3 += inc5 */
+       0x70000002, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT MORE init=0 WS=0 RS=0 */
+       0x034cfc4e, /*     DRD2B1: var13 = EU3(); EU3(*idx1,var14)  */
+       0x00008868, /*     DRD1A: idx2 = var13; FN=0 init=0 WS=0 RS=0 */
+       0x99198341, /*   LCD: idx2 = idx2, idx3 = idx3; idx2 > var13; idx2 += inc0, idx3 += inc1 */
+       0x007ecf80, /*     DRD1A: *idx3 = *idx0; FN=0 init=3 WS=3 RS=3 */
+       0x99198272, /*   LCD: idx2 = idx2, idx3 = idx3; idx2 > var9; idx2 += inc6, idx3 += inc2 */
+       0x046acf80, /*     DRD1A: *idx3 = *idx0; FN=0 INT init=3 WS=1 RS=1 */
+       0x9819002d, /*   LCD: idx2 = idx0; idx2 once var0; idx2 += inc5 */
+       0x0060c790, /*     DRD1A: *idx1 = *idx2; FN=0 init=3 WS=0 RS=0 */
+       0x000001f8, /*   NOP */
+
+       /* VAR[9]-VAR[14] */
+       0x40000000,
+       0x7fff7fff,
+       0x00000000,
+       0x00000003,
+       0x40000008,
+       0x43ffffff,
+
+       /* INC[0]-INC[6] */
+       0x40000000,
+       0xe0000000,
+       0xe0000000,
+       0xa0000008,
+       0x20000000,
+       0x00000000,
+       0x4000ffff,
+};
+
diff --git a/drivers/dma/bestcomm/bcom_fec_tx_task.c b/drivers/dma/bestcomm/bcom_fec_tx_task.c
new file mode 100644 (file)
index 0000000..b1c495c
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * Bestcomm FEC TX task microcode
+ *
+ * Copyright (c) 2004 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 version 2 as published
+ * by the Free Software Foundation.
+ *
+ * Automatically created based on BestCommAPI-2.2/code_dma/image_rtos1/dma_image.hex
+ * on Tue Mar 22 11:19:29 2005 GMT
+ */
+
+#include <asm/types.h>
+
+/*
+ * The header consists of the following fields:
+ *     u32     magic;
+ *     u8      desc_size;
+ *     u8      var_size;
+ *     u8      inc_size;
+ *     u8      first_var;
+ *     u8      reserved[8];
+ *
+ * The size fields contain the number of 32-bit words.
+ */
+
+u32 bcom_fec_tx_task[] = {
+       /* header */
+       0x4243544b,
+       0x2407070d,
+       0x00000000,
+       0x00000000,
+
+       /* Task descriptors */
+       0x8018001b, /* LCD: idx0 = var0; idx0 <= var0; idx0 += inc3 */
+       0x60000005, /*   DRD2A: EU0=0 EU1=0 EU2=0 EU3=5 EXT init=0 WS=0 RS=0 */
+       0x01ccfc0d, /*   DRD2B1: var7 = EU3(); EU3(*idx0,var13)  */
+       0x8082a123, /* LCD: idx0 = var1, idx1 = var5; idx1 <= var4; idx0 += inc4, idx1 += inc3 */
+       0x10801418, /*   DRD1A: var5 = var3; FN=0 MORE init=4 WS=0 RS=0 */
+       0xf88103a4, /*   LCDEXT: idx2 = *idx1, idx3 = var2; idx2 < var14; idx2 += inc4, idx3 += inc4 */
+       0x801a6024, /*   LCD: idx4 = var0; ; idx4 += inc4 */
+       0x10001708, /*     DRD1A: var5 = idx1; FN=0 MORE init=0 WS=0 RS=0 */
+       0x60140002, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT init=0 WS=2 RS=2 */
+       0x0cccfccf, /*     DRD2B1: *idx3 = EU3(); EU3(*idx3,var15)  */
+       0x991a002c, /*   LCD: idx2 = idx2, idx3 = idx4; idx2 once var0; idx2 += inc5, idx3 += inc4 */
+       0x70000002, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT MORE init=0 WS=0 RS=0 */
+       0x024cfc4d, /*     DRD2B1: var9 = EU3(); EU3(*idx1,var13)  */
+       0x60000003, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=3 EXT init=0 WS=0 RS=0 */
+       0x0cccf247, /*     DRD2B1: *idx3 = EU3(); EU3(var9,var7)  */
+       0x80004000, /*   LCDEXT: idx2 = 0x00000000; ; */
+       0xb8c80029, /*   LCD: idx3 = *(idx1 + var0000001a); idx3 once var0; idx3 += inc5 */
+       0x70000002, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT MORE init=0 WS=0 RS=0 */
+       0x088cf8d1, /*     DRD2B1: idx2 = EU3(); EU3(idx3,var17)  */
+       0x00002f10, /*     DRD1A: var11 = idx2; FN=0 init=0 WS=0 RS=0 */
+       0x99198432, /*   LCD: idx2 = idx2, idx3 = idx3; idx2 > var16; idx2 += inc6, idx3 += inc2 */
+       0x008ac398, /*     DRD1A: *idx0 = *idx3; FN=0 init=4 WS=1 RS=1 */
+       0x80004000, /*   LCDEXT: idx2 = 0x00000000; ; */
+       0x9999802d, /*   LCD: idx3 = idx3; idx3 once var0; idx3 += inc5 */
+       0x70000002, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT MORE init=0 WS=0 RS=0 */
+       0x048cfc53, /*     DRD2B1: var18 = EU3(); EU3(*idx1,var19)  */
+       0x60000008, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=8 EXT init=0 WS=0 RS=0 */
+       0x088cf48b, /*     DRD2B1: idx2 = EU3(); EU3(var18,var11)  */
+       0x99198481, /*   LCD: idx2 = idx2, idx3 = idx3; idx2 > var18; idx2 += inc0, idx3 += inc1 */
+       0x009ec398, /*     DRD1A: *idx0 = *idx3; FN=0 init=4 WS=3 RS=3 */
+       0x991983b2, /*   LCD: idx2 = idx2, idx3 = idx3; idx2 > var14; idx2 += inc6, idx3 += inc2 */
+       0x088ac398, /*     DRD1A: *idx0 = *idx3; FN=0 TFD init=4 WS=1 RS=1 */
+       0x9919002d, /*   LCD: idx2 = idx2; idx2 once var0; idx2 += inc5 */
+       0x60000005, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=5 EXT init=0 WS=0 RS=0 */
+       0x0c4cf88e, /*     DRD2B1: *idx1 = EU3(); EU3(idx2,var14)  */
+       0x000001f8, /*   NOP */
+
+       /* VAR[13]-VAR[19] */
+       0x0c000000,
+       0x40000000,
+       0x7fff7fff,
+       0x00000000,
+       0x00000003,
+       0x40000004,
+       0x43ffffff,
+
+       /* INC[0]-INC[6] */
+       0x40000000,
+       0xe0000000,
+       0xe0000000,
+       0xa0000008,
+       0x20000000,
+       0x00000000,
+       0x4000ffff,
+};
+
diff --git a/drivers/dma/bestcomm/bcom_gen_bd_rx_task.c b/drivers/dma/bestcomm/bcom_gen_bd_rx_task.c
new file mode 100644 (file)
index 0000000..efee022
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Bestcomm GenBD RX task microcode
+ *
+ * Copyright (C) 2006 AppSpec Computer Technologies Corp.
+ *                    Jeff Gibbons <jeff.gibbons@appspec.com>
+ * Copyright (c) 2004 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 version 2 as published
+ * by the Free Software Foundation.
+ *
+ * Based on BestCommAPI-2.2/code_dma/image_rtos1/dma_image.hex
+ * on Tue Mar 4 10:14:12 2006 GMT
+ *
+ */
+
+#include <asm/types.h>
+
+/*
+ * The header consists of the following fields:
+ *     u32     magic;
+ *     u8      desc_size;
+ *     u8      var_size;
+ *     u8      inc_size;
+ *     u8      first_var;
+ *     u8      reserved[8];
+ *
+ * The size fields contain the number of 32-bit words.
+ */
+
+u32 bcom_gen_bd_rx_task[] = {
+       /* header */
+       0x4243544b,
+       0x0d020409,
+       0x00000000,
+       0x00000000,
+
+       /* Task descriptors */
+       0x808220da, /* LCD: idx0 = var1, idx1 = var4; idx1 <= var3; idx0 += inc3, idx1 += inc2 */
+       0x13e01010, /*   DRD1A: var4 = var2; FN=0 MORE init=31 WS=0 RS=0 */
+       0xb880025b, /*   LCD: idx2 = *idx1, idx3 = var0; idx2 < var9; idx2 += inc3, idx3 += inc3 */
+       0x10001308, /*     DRD1A: var4 = idx1; FN=0 MORE init=0 WS=0 RS=0 */
+       0x60140002, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT init=0 WS=2 RS=2 */
+       0x0cccfcca, /*     DRD2B1: *idx3 = EU3(); EU3(*idx3,var10)  */
+       0xd9190240, /*   LCDEXT: idx2 = idx2; idx2 > var9; idx2 += inc0 */
+       0xb8c5e009, /*   LCD: idx3 = *(idx1 + var00000015); ; idx3 += inc1 */
+       0x07fecf80, /*     DRD1A: *idx3 = *idx0; FN=0 INT init=31 WS=3 RS=3 */
+       0x99190024, /*   LCD: idx2 = idx2; idx2 once var0; idx2 += inc4 */
+       0x60000005, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=5 EXT init=0 WS=0 RS=0 */
+       0x0c4cf889, /*     DRD2B1: *idx1 = EU3(); EU3(idx2,var9)  */
+       0x000001f8, /*   NOP */
+
+       /* VAR[9]-VAR[10] */
+       0x40000000,
+       0x7fff7fff,
+
+       /* INC[0]-INC[3] */
+       0x40000000,
+       0xe0000000,
+       0xa0000008,
+       0x20000000,
+};
+
diff --git a/drivers/dma/bestcomm/bcom_gen_bd_tx_task.c b/drivers/dma/bestcomm/bcom_gen_bd_tx_task.c
new file mode 100644 (file)
index 0000000..c605aa4
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Bestcomm GenBD TX task microcode
+ *
+ * Copyright (C) 2006 AppSpec Computer Technologies Corp.
+ *                    Jeff Gibbons <jeff.gibbons@appspec.com>
+ * Copyright (c) 2004 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 version 2 as published
+ * by the Free Software Foundation.
+ *
+ * Based on BestCommAPI-2.2/code_dma/image_rtos1/dma_image.hex
+ * on Tue Mar 4 10:14:12 2006 GMT
+ *
+ */
+
+#include <asm/types.h>
+
+/*
+ * The header consists of the following fields:
+ *     u32     magic;
+ *     u8      desc_size;
+ *     u8      var_size;
+ *     u8      inc_size;
+ *     u8      first_var;
+ *     u8      reserved[8];
+ *
+ * The size fields contain the number of 32-bit words.
+ */
+
+u32 bcom_gen_bd_tx_task[] = {
+       /* header */
+       0x4243544b,
+       0x0f040609,
+       0x00000000,
+       0x00000000,
+
+       /* Task descriptors */
+       0x800220e3, /* LCD: idx0 = var0, idx1 = var4; idx1 <= var3; idx0 += inc4, idx1 += inc3 */
+       0x13e01010, /*   DRD1A: var4 = var2; FN=0 MORE init=31 WS=0 RS=0 */
+       0xb8808264, /*   LCD: idx2 = *idx1, idx3 = var1; idx2 < var9; idx2 += inc4, idx3 += inc4 */
+       0x10001308, /*     DRD1A: var4 = idx1; FN=0 MORE init=0 WS=0 RS=0 */
+       0x60140002, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT init=0 WS=2 RS=2 */
+       0x0cccfcca, /*     DRD2B1: *idx3 = EU3(); EU3(*idx3,var10)  */
+       0xd9190300, /*   LCDEXT: idx2 = idx2; idx2 > var12; idx2 += inc0 */
+       0xb8c5e009, /*   LCD: idx3 = *(idx1 + var00000015); ; idx3 += inc1 */
+       0x03fec398, /*     DRD1A: *idx0 = *idx3; FN=0 init=31 WS=3 RS=3 */
+       0x9919826a, /*   LCD: idx2 = idx2, idx3 = idx3; idx2 > var9; idx2 += inc5, idx3 += inc2 */
+       0x0feac398, /*     DRD1A: *idx0 = *idx3; FN=0 TFD INT init=31 WS=1 RS=1 */
+       0x99190036, /*   LCD: idx2 = idx2; idx2 once var0; idx2 += inc6 */
+       0x60000005, /*     DRD2A: EU0=0 EU1=0 EU2=0 EU3=5 EXT init=0 WS=0 RS=0 */
+       0x0c4cf889, /*     DRD2B1: *idx1 = EU3(); EU3(idx2,var9)  */
+       0x000001f8, /*   NOP */
+
+       /* VAR[9]-VAR[12] */
+       0x40000000,
+       0x7fff7fff,
+       0x00000000,
+       0x40000004,
+
+       /* INC[0]-INC[5] */
+       0x40000000,
+       0xe0000000,
+       0xe0000000,
+       0xa0000008,
+       0x20000000,
+       0x4000ffff,
+};
+
diff --git a/drivers/dma/bestcomm/bestcomm.c b/drivers/dma/bestcomm/bestcomm.c
new file mode 100644 (file)
index 0000000..3a18946
--- /dev/null
@@ -0,0 +1,531 @@
+/*
+ * Driver for MPC52xx processor BestComm peripheral controller
+ *
+ *
+ * Copyright (C) 2006-2007 Sylvain Munaut <tnt@246tNt.com>
+ * Copyright (C) 2005      Varma Electronics Oy,
+ *                         ( by Andrey Volkov <avolkov@varma-el.com> )
+ * Copyright (C) 2003-2004 MontaVista, Software, Inc.
+ *                         ( by Dale Farnsworth <dfarnsworth@mvista.com> )
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/of_platform.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/mpc52xx.h>
+
+#include <linux/fsl/bestcomm/sram.h>
+#include <linux/fsl/bestcomm/bestcomm_priv.h>
+#include "linux/fsl/bestcomm/bestcomm.h"
+
+#define DRIVER_NAME "bestcomm-core"
+
+/* MPC5200 device tree match tables */
+static struct of_device_id mpc52xx_sram_ids[] = {
+       { .compatible = "fsl,mpc5200-sram", },
+       { .compatible = "mpc5200-sram", },
+       {}
+};
+
+
+struct bcom_engine *bcom_eng = NULL;
+EXPORT_SYMBOL_GPL(bcom_eng);   /* needed for inline functions */
+
+/* ======================================================================== */
+/* Public and private API                                                   */
+/* ======================================================================== */
+
+/* Private API */
+
+struct bcom_task *
+bcom_task_alloc(int bd_count, int bd_size, int priv_size)
+{
+       int i, tasknum = -1;
+       struct bcom_task *tsk;
+
+       /* Don't try to do anything if bestcomm init failed */
+       if (!bcom_eng)
+               return NULL;
+
+       /* Get and reserve a task num */
+       spin_lock(&bcom_eng->lock);
+
+       for (i=0; i<BCOM_MAX_TASKS; i++)
+               if (!bcom_eng->tdt[i].stop) {   /* we use stop as a marker */
+                       bcom_eng->tdt[i].stop = 0xfffffffful; /* dummy addr */
+                       tasknum = i;
+                       break;
+               }
+
+       spin_unlock(&bcom_eng->lock);
+
+       if (tasknum < 0)
+               return NULL;
+
+       /* Allocate our structure */
+       tsk = kzalloc(sizeof(struct bcom_task) + priv_size, GFP_KERNEL);
+       if (!tsk)
+               goto error;
+
+       tsk->tasknum = tasknum;
+       if (priv_size)
+               tsk->priv = (void*)tsk + sizeof(struct bcom_task);
+
+       /* Get IRQ of that task */
+       tsk->irq = irq_of_parse_and_map(bcom_eng->ofnode, tsk->tasknum);
+       if (tsk->irq == NO_IRQ)
+               goto error;
+
+       /* Init the BDs, if needed */
+       if (bd_count) {
+               tsk->cookie = kmalloc(sizeof(void*) * bd_count, GFP_KERNEL);
+               if (!tsk->cookie)
+                       goto error;
+
+               tsk->bd = bcom_sram_alloc(bd_count * bd_size, 4, &tsk->bd_pa);
+               if (!tsk->bd)
+                       goto error;
+               memset(tsk->bd, 0x00, bd_count * bd_size);
+
+               tsk->num_bd = bd_count;
+               tsk->bd_size = bd_size;
+       }
+
+       return tsk;
+
+error:
+       if (tsk) {
+               if (tsk->irq != NO_IRQ)
+                       irq_dispose_mapping(tsk->irq);
+               bcom_sram_free(tsk->bd);
+               kfree(tsk->cookie);
+               kfree(tsk);
+       }
+
+       bcom_eng->tdt[tasknum].stop = 0;
+
+       return NULL;
+}
+EXPORT_SYMBOL_GPL(bcom_task_alloc);
+
+void
+bcom_task_free(struct bcom_task *tsk)
+{
+       /* Stop the task */
+       bcom_disable_task(tsk->tasknum);
+
+       /* Clear TDT */
+       bcom_eng->tdt[tsk->tasknum].start = 0;
+       bcom_eng->tdt[tsk->tasknum].stop  = 0;
+
+       /* Free everything */
+       irq_dispose_mapping(tsk->irq);
+       bcom_sram_free(tsk->bd);
+       kfree(tsk->cookie);
+       kfree(tsk);
+}
+EXPORT_SYMBOL_GPL(bcom_task_free);
+
+int
+bcom_load_image(int task, u32 *task_image)
+{
+       struct bcom_task_header *hdr = (struct bcom_task_header *)task_image;
+       struct bcom_tdt *tdt;
+       u32 *desc, *var, *inc;
+       u32 *desc_src, *var_src, *inc_src;
+
+       /* Safety checks */
+       if (hdr->magic != BCOM_TASK_MAGIC) {
+               printk(KERN_ERR DRIVER_NAME
+                       ": Trying to load invalid microcode\n");
+               return -EINVAL;
+       }
+
+       if ((task < 0) || (task >= BCOM_MAX_TASKS)) {
+               printk(KERN_ERR DRIVER_NAME
+                       ": Trying to load invalid task %d\n", task);
+               return -EINVAL;
+       }
+
+       /* Initial load or reload */
+       tdt = &bcom_eng->tdt[task];
+
+       if (tdt->start) {
+               desc = bcom_task_desc(task);
+               if (hdr->desc_size != bcom_task_num_descs(task)) {
+                       printk(KERN_ERR DRIVER_NAME
+                               ": Trying to reload wrong task image "
+                               "(%d size %d/%d)!\n",
+                               task,
+                               hdr->desc_size,
+                               bcom_task_num_descs(task));
+                       return -EINVAL;
+               }
+       } else {
+               phys_addr_t start_pa;
+
+               desc = bcom_sram_alloc(hdr->desc_size * sizeof(u32), 4, &start_pa);
+               if (!desc)
+                       return -ENOMEM;
+
+               tdt->start = start_pa;
+               tdt->stop = start_pa + ((hdr->desc_size-1) * sizeof(u32));
+       }
+
+       var = bcom_task_var(task);
+       inc = bcom_task_inc(task);
+
+       /* Clear & copy */
+       memset(var, 0x00, BCOM_VAR_SIZE);
+       memset(inc, 0x00, BCOM_INC_SIZE);
+
+       desc_src = (u32 *)(hdr + 1);
+       var_src = desc_src + hdr->desc_size;
+       inc_src = var_src + hdr->var_size;
+
+       memcpy(desc, desc_src, hdr->desc_size * sizeof(u32));
+       memcpy(var + hdr->first_var, var_src, hdr->var_size * sizeof(u32));
+       memcpy(inc, inc_src, hdr->inc_size * sizeof(u32));
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(bcom_load_image);
+
+void
+bcom_set_initiator(int task, int initiator)
+{
+       int i;
+       int num_descs;
+       u32 *desc;
+       int next_drd_has_initiator;
+
+       bcom_set_tcr_initiator(task, initiator);
+
+       /* Just setting tcr is apparently not enough due to some problem */
+       /* with it. So we just go thru all the microcode and replace in  */
+       /* the DRD directly */
+
+       desc = bcom_task_desc(task);
+       next_drd_has_initiator = 1;
+       num_descs = bcom_task_num_descs(task);
+
+       for (i=0; i<num_descs; i++, desc++) {
+               if (!bcom_desc_is_drd(*desc))
+                       continue;
+               if (next_drd_has_initiator)
+                       if (bcom_desc_initiator(*desc) != BCOM_INITIATOR_ALWAYS)
+                               bcom_set_desc_initiator(desc, initiator);
+               next_drd_has_initiator = !bcom_drd_is_extended(*desc);
+       }
+}
+EXPORT_SYMBOL_GPL(bcom_set_initiator);
+
+
+/* Public API */
+
+void
+bcom_enable(struct bcom_task *tsk)
+{
+       bcom_enable_task(tsk->tasknum);
+}
+EXPORT_SYMBOL_GPL(bcom_enable);
+
+void
+bcom_disable(struct bcom_task *tsk)
+{
+       bcom_disable_task(tsk->tasknum);
+}
+EXPORT_SYMBOL_GPL(bcom_disable);
+
+
+/* ======================================================================== */
+/* Engine init/cleanup                                                      */
+/* ======================================================================== */
+
+/* Function Descriptor table */
+/* this will need to be updated if Freescale changes their task code FDT */
+static u32 fdt_ops[] = {
+       0xa0045670,     /* FDT[48] - load_acc()   */
+       0x80045670,     /* FDT[49] - unload_acc() */
+       0x21800000,     /* FDT[50] - and()        */
+       0x21e00000,     /* FDT[51] - or()         */
+       0x21500000,     /* FDT[52] - xor()        */
+       0x21400000,     /* FDT[53] - andn()       */
+       0x21500000,     /* FDT[54] - not()        */
+       0x20400000,     /* FDT[55] - add()        */
+       0x20500000,     /* FDT[56] - sub()        */
+       0x20800000,     /* FDT[57] - lsh()        */
+       0x20a00000,     /* FDT[58] - rsh()        */
+       0xc0170000,     /* FDT[59] - crc8()       */
+       0xc0145670,     /* FDT[60] - crc16()      */
+       0xc0345670,     /* FDT[61] - crc32()      */
+       0xa0076540,     /* FDT[62] - endian32()   */
+       0xa0000760,     /* FDT[63] - endian16()   */
+};
+
+
+static int bcom_engine_init(void)
+{
+       int task;
+       phys_addr_t tdt_pa, ctx_pa, var_pa, fdt_pa;
+       unsigned int tdt_size, ctx_size, var_size, fdt_size;
+
+       /* Allocate & clear SRAM zones for FDT, TDTs, contexts and vars/incs */
+       tdt_size = BCOM_MAX_TASKS * sizeof(struct bcom_tdt);
+       ctx_size = BCOM_MAX_TASKS * BCOM_CTX_SIZE;
+       var_size = BCOM_MAX_TASKS * (BCOM_VAR_SIZE + BCOM_INC_SIZE);
+       fdt_size = BCOM_FDT_SIZE;
+
+       bcom_eng->tdt = bcom_sram_alloc(tdt_size, sizeof(u32), &tdt_pa);
+       bcom_eng->ctx = bcom_sram_alloc(ctx_size, BCOM_CTX_ALIGN, &ctx_pa);
+       bcom_eng->var = bcom_sram_alloc(var_size, BCOM_VAR_ALIGN, &var_pa);
+       bcom_eng->fdt = bcom_sram_alloc(fdt_size, BCOM_FDT_ALIGN, &fdt_pa);
+
+       if (!bcom_eng->tdt || !bcom_eng->ctx || !bcom_eng->var || !bcom_eng->fdt) {
+               printk(KERN_ERR "DMA: SRAM alloc failed in engine init !\n");
+
+               bcom_sram_free(bcom_eng->tdt);
+               bcom_sram_free(bcom_eng->ctx);
+               bcom_sram_free(bcom_eng->var);
+               bcom_sram_free(bcom_eng->fdt);
+
+               return -ENOMEM;
+       }
+
+       memset(bcom_eng->tdt, 0x00, tdt_size);
+       memset(bcom_eng->ctx, 0x00, ctx_size);
+       memset(bcom_eng->var, 0x00, var_size);
+       memset(bcom_eng->fdt, 0x00, fdt_size);
+
+       /* Copy the FDT for the EU#3 */
+       memcpy(&bcom_eng->fdt[48], fdt_ops, sizeof(fdt_ops));
+
+       /* Initialize Task base structure */
+       for (task=0; task<BCOM_MAX_TASKS; task++)
+       {
+               out_be16(&bcom_eng->regs->tcr[task], 0);
+               out_8(&bcom_eng->regs->ipr[task], 0);
+
+               bcom_eng->tdt[task].context     = ctx_pa;
+               bcom_eng->tdt[task].var = var_pa;
+               bcom_eng->tdt[task].fdt = fdt_pa;
+
+               var_pa += BCOM_VAR_SIZE + BCOM_INC_SIZE;
+               ctx_pa += BCOM_CTX_SIZE;
+       }
+
+       out_be32(&bcom_eng->regs->taskBar, tdt_pa);
+
+       /* Init 'always' initiator */
+       out_8(&bcom_eng->regs->ipr[BCOM_INITIATOR_ALWAYS], BCOM_IPR_ALWAYS);
+
+       /* Disable COMM Bus Prefetch on the original 5200; it's broken */
+       if ((mfspr(SPRN_SVR) & MPC5200_SVR_MASK) == MPC5200_SVR)
+               bcom_disable_prefetch();
+
+       /* Init lock */
+       spin_lock_init(&bcom_eng->lock);
+
+       return 0;
+}
+
+static void
+bcom_engine_cleanup(void)
+{
+       int task;
+
+       /* Stop all tasks */
+       for (task=0; task<BCOM_MAX_TASKS; task++)
+       {
+               out_be16(&bcom_eng->regs->tcr[task], 0);
+               out_8(&bcom_eng->regs->ipr[task], 0);
+       }
+
+       out_be32(&bcom_eng->regs->taskBar, 0ul);
+
+       /* Release the SRAM zones */
+       bcom_sram_free(bcom_eng->tdt);
+       bcom_sram_free(bcom_eng->ctx);
+       bcom_sram_free(bcom_eng->var);
+       bcom_sram_free(bcom_eng->fdt);
+}
+
+
+/* ======================================================================== */
+/* OF platform driver                                                       */
+/* ======================================================================== */
+
+static int mpc52xx_bcom_probe(struct platform_device *op)
+{
+       struct device_node *ofn_sram;
+       struct resource res_bcom;
+
+       int rv;
+
+       /* Inform user we're ok so far */
+       printk(KERN_INFO "DMA: MPC52xx BestComm driver\n");
+
+       /* Get the bestcomm node */
+       of_node_get(op->dev.of_node);
+
+       /* Prepare SRAM */
+       ofn_sram = of_find_matching_node(NULL, mpc52xx_sram_ids);
+       if (!ofn_sram) {
+               printk(KERN_ERR DRIVER_NAME ": "
+                       "No SRAM found in device tree\n");
+               rv = -ENODEV;
+               goto error_ofput;
+       }
+       rv = bcom_sram_init(ofn_sram, DRIVER_NAME);
+       of_node_put(ofn_sram);
+
+       if (rv) {
+               printk(KERN_ERR DRIVER_NAME ": "
+                       "Error in SRAM init\n");
+               goto error_ofput;
+       }
+
+       /* Get a clean struct */
+       bcom_eng = kzalloc(sizeof(struct bcom_engine), GFP_KERNEL);
+       if (!bcom_eng) {
+               printk(KERN_ERR DRIVER_NAME ": "
+                       "Can't allocate state structure\n");
+               rv = -ENOMEM;
+               goto error_sramclean;
+       }
+
+       /* Save the node */
+       bcom_eng->ofnode = op->dev.of_node;
+
+       /* Get, reserve & map io */
+       if (of_address_to_resource(op->dev.of_node, 0, &res_bcom)) {
+               printk(KERN_ERR DRIVER_NAME ": "
+                       "Can't get resource\n");
+               rv = -EINVAL;
+               goto error_sramclean;
+       }
+
+       if (!request_mem_region(res_bcom.start, sizeof(struct mpc52xx_sdma),
+                               DRIVER_NAME)) {
+               printk(KERN_ERR DRIVER_NAME ": "
+                       "Can't request registers region\n");
+               rv = -EBUSY;
+               goto error_sramclean;
+       }
+
+       bcom_eng->regs_base = res_bcom.start;
+       bcom_eng->regs = ioremap(res_bcom.start, sizeof(struct mpc52xx_sdma));
+       if (!bcom_eng->regs) {
+               printk(KERN_ERR DRIVER_NAME ": "
+                       "Can't map registers\n");
+               rv = -ENOMEM;
+               goto error_release;
+       }
+
+       /* Now, do the real init */
+       rv = bcom_engine_init();
+       if (rv)
+               goto error_unmap;
+
+       /* Done ! */
+       printk(KERN_INFO "DMA: MPC52xx BestComm engine @%08lx ok !\n",
+               (long)bcom_eng->regs_base);
+
+       return 0;
+
+       /* Error path */
+error_unmap:
+       iounmap(bcom_eng->regs);
+error_release:
+       release_mem_region(res_bcom.start, sizeof(struct mpc52xx_sdma));
+error_sramclean:
+       kfree(bcom_eng);
+       bcom_sram_cleanup();
+error_ofput:
+       of_node_put(op->dev.of_node);
+
+       printk(KERN_ERR "DMA: MPC52xx BestComm init failed !\n");
+
+       return rv;
+}
+
+
+static int mpc52xx_bcom_remove(struct platform_device *op)
+{
+       /* Clean up the engine */
+       bcom_engine_cleanup();
+
+       /* Cleanup SRAM */
+       bcom_sram_cleanup();
+
+       /* Release regs */
+       iounmap(bcom_eng->regs);
+       release_mem_region(bcom_eng->regs_base, sizeof(struct mpc52xx_sdma));
+
+       /* Release the node */
+       of_node_put(bcom_eng->ofnode);
+
+       /* Release memory */
+       kfree(bcom_eng);
+       bcom_eng = NULL;
+
+       return 0;
+}
+
+static struct of_device_id mpc52xx_bcom_of_match[] = {
+       { .compatible = "fsl,mpc5200-bestcomm", },
+       { .compatible = "mpc5200-bestcomm", },
+       {},
+};
+
+MODULE_DEVICE_TABLE(of, mpc52xx_bcom_of_match);
+
+
+static struct platform_driver mpc52xx_bcom_of_platform_driver = {
+       .probe          = mpc52xx_bcom_probe,
+       .remove         = mpc52xx_bcom_remove,
+       .driver = {
+               .name = DRIVER_NAME,
+               .owner = THIS_MODULE,
+               .of_match_table = mpc52xx_bcom_of_match,
+       },
+};
+
+
+/* ======================================================================== */
+/* Module                                                                   */
+/* ======================================================================== */
+
+static int __init
+mpc52xx_bcom_init(void)
+{
+       return platform_driver_register(&mpc52xx_bcom_of_platform_driver);
+}
+
+static void __exit
+mpc52xx_bcom_exit(void)
+{
+       platform_driver_unregister(&mpc52xx_bcom_of_platform_driver);
+}
+
+/* If we're not a module, we must make sure everything is setup before  */
+/* anyone tries to use us ... that's why we use subsys_initcall instead */
+/* of module_init. */
+subsys_initcall(mpc52xx_bcom_init);
+module_exit(mpc52xx_bcom_exit);
+
+MODULE_DESCRIPTION("Freescale MPC52xx BestComm DMA");
+MODULE_AUTHOR("Sylvain Munaut <tnt@246tNt.com>");
+MODULE_AUTHOR("Andrey Volkov <avolkov@varma-el.com>");
+MODULE_AUTHOR("Dale Farnsworth <dfarnsworth@mvista.com>");
+MODULE_LICENSE("GPL v2");
+
diff --git a/drivers/dma/bestcomm/fec.c b/drivers/dma/bestcomm/fec.c
new file mode 100644 (file)
index 0000000..7f1fb1c
--- /dev/null
@@ -0,0 +1,270 @@
+/*
+ * Bestcomm FEC tasks driver
+ *
+ *
+ * Copyright (C) 2006-2007 Sylvain Munaut <tnt@246tNt.com>
+ * Copyright (C) 2003-2004 MontaVista, Software, Inc.
+ *                         ( by Dale Farnsworth <dfarnsworth@mvista.com> )
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/types.h>
+#include <asm/io.h>
+
+#include <linux/fsl/bestcomm/bestcomm.h>
+#include <linux/fsl/bestcomm/bestcomm_priv.h>
+#include <linux/fsl/bestcomm/fec.h>
+
+
+/* ======================================================================== */
+/* Task image/var/inc                                                       */
+/* ======================================================================== */
+
+/* fec tasks images */
+extern u32 bcom_fec_rx_task[];
+extern u32 bcom_fec_tx_task[];
+
+/* rx task vars that need to be set before enabling the task */
+struct bcom_fec_rx_var {
+       u32 enable;             /* (u16*) address of task's control register */
+       u32 fifo;               /* (u32*) address of fec's fifo */
+       u32 bd_base;            /* (struct bcom_bd*) beginning of ring buffer */
+       u32 bd_last;            /* (struct bcom_bd*) end of ring buffer */
+       u32 bd_start;           /* (struct bcom_bd*) current bd */
+       u32 buffer_size;        /* size of receive buffer */
+};
+
+/* rx task incs that need to be set before enabling the task */
+struct bcom_fec_rx_inc {
+       u16 pad0;
+       s16 incr_bytes;
+       u16 pad1;
+       s16 incr_dst;
+       u16 pad2;
+       s16 incr_dst_ma;
+};
+
+/* tx task vars that need to be set before enabling the task */
+struct bcom_fec_tx_var {
+       u32 DRD;                /* (u32*) address of self-modified DRD */
+       u32 fifo;               /* (u32*) address of fec's fifo */
+       u32 enable;             /* (u16*) address of task's control register */
+       u32 bd_base;            /* (struct bcom_bd*) beginning of ring buffer */
+       u32 bd_last;            /* (struct bcom_bd*) end of ring buffer */
+       u32 bd_start;           /* (struct bcom_bd*) current bd */
+       u32 buffer_size;        /* set by uCode for each packet */
+};
+
+/* tx task incs that need to be set before enabling the task */
+struct bcom_fec_tx_inc {
+       u16 pad0;
+       s16 incr_bytes;
+       u16 pad1;
+       s16 incr_src;
+       u16 pad2;
+       s16 incr_src_ma;
+};
+
+/* private structure in the task */
+struct bcom_fec_priv {
+       phys_addr_t     fifo;
+       int             maxbufsize;
+};
+
+
+/* ======================================================================== */
+/* Task support code                                                        */
+/* ======================================================================== */
+
+struct bcom_task *
+bcom_fec_rx_init(int queue_len, phys_addr_t fifo, int maxbufsize)
+{
+       struct bcom_task *tsk;
+       struct bcom_fec_priv *priv;
+
+       tsk = bcom_task_alloc(queue_len, sizeof(struct bcom_fec_bd),
+                               sizeof(struct bcom_fec_priv));
+       if (!tsk)
+               return NULL;
+
+       tsk->flags = BCOM_FLAGS_NONE;
+
+       priv = tsk->priv;
+       priv->fifo = fifo;
+       priv->maxbufsize = maxbufsize;
+
+       if (bcom_fec_rx_reset(tsk)) {
+               bcom_task_free(tsk);
+               return NULL;
+       }
+
+       return tsk;
+}
+EXPORT_SYMBOL_GPL(bcom_fec_rx_init);
+
+int
+bcom_fec_rx_reset(struct bcom_task *tsk)
+{
+       struct bcom_fec_priv *priv = tsk->priv;
+       struct bcom_fec_rx_var *var;
+       struct bcom_fec_rx_inc *inc;
+
+       /* Shutdown the task */
+       bcom_disable_task(tsk->tasknum);
+
+       /* Reset the microcode */
+       var = (struct bcom_fec_rx_var *) bcom_task_var(tsk->tasknum);
+       inc = (struct bcom_fec_rx_inc *) bcom_task_inc(tsk->tasknum);
+
+       if (bcom_load_image(tsk->tasknum, bcom_fec_rx_task))
+               return -1;
+
+       var->enable     = bcom_eng->regs_base +
+                               offsetof(struct mpc52xx_sdma, tcr[tsk->tasknum]);
+       var->fifo       = (u32) priv->fifo;
+       var->bd_base    = tsk->bd_pa;
+       var->bd_last    = tsk->bd_pa + ((tsk->num_bd-1) * tsk->bd_size);
+       var->bd_start   = tsk->bd_pa;
+       var->buffer_size = priv->maxbufsize;
+
+       inc->incr_bytes = -(s16)sizeof(u32);    /* These should be in the   */
+       inc->incr_dst   = sizeof(u32);          /* task image, but we stick */
+       inc->incr_dst_ma= sizeof(u8);           /* to the official ones     */
+
+       /* Reset the BDs */
+       tsk->index = 0;
+       tsk->outdex = 0;
+
+       memset(tsk->bd, 0x00, tsk->num_bd * tsk->bd_size);
+
+       /* Configure some stuff */
+       bcom_set_task_pragma(tsk->tasknum, BCOM_FEC_RX_BD_PRAGMA);
+       bcom_set_task_auto_start(tsk->tasknum, tsk->tasknum);
+
+       out_8(&bcom_eng->regs->ipr[BCOM_INITIATOR_FEC_RX], BCOM_IPR_FEC_RX);
+
+       out_be32(&bcom_eng->regs->IntPend, 1<<tsk->tasknum);    /* Clear ints */
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(bcom_fec_rx_reset);
+
+void
+bcom_fec_rx_release(struct bcom_task *tsk)
+{
+       /* Nothing special for the FEC tasks */
+       bcom_task_free(tsk);
+}
+EXPORT_SYMBOL_GPL(bcom_fec_rx_release);
+
+
+
+       /* Return 2nd to last DRD */
+       /* This is an ugly hack, but at least it's only done
+          once at initialization */
+static u32 *self_modified_drd(int tasknum)
+{
+       u32 *desc;
+       int num_descs;
+       int drd_count;
+       int i;
+
+       num_descs = bcom_task_num_descs(tasknum);
+       desc = bcom_task_desc(tasknum) + num_descs - 1;
+       drd_count = 0;
+       for (i=0; i<num_descs; i++, desc--)
+               if (bcom_desc_is_drd(*desc) && ++drd_count == 3)
+                       break;
+       return desc;
+}
+
+struct bcom_task *
+bcom_fec_tx_init(int queue_len, phys_addr_t fifo)
+{
+       struct bcom_task *tsk;
+       struct bcom_fec_priv *priv;
+
+       tsk = bcom_task_alloc(queue_len, sizeof(struct bcom_fec_bd),
+                               sizeof(struct bcom_fec_priv));
+       if (!tsk)
+               return NULL;
+
+       tsk->flags = BCOM_FLAGS_ENABLE_TASK;
+
+       priv = tsk->priv;
+       priv->fifo = fifo;
+
+       if (bcom_fec_tx_reset(tsk)) {
+               bcom_task_free(tsk);
+               return NULL;
+       }
+
+       return tsk;
+}
+EXPORT_SYMBOL_GPL(bcom_fec_tx_init);
+
+int
+bcom_fec_tx_reset(struct bcom_task *tsk)
+{
+       struct bcom_fec_priv *priv = tsk->priv;
+       struct bcom_fec_tx_var *var;
+       struct bcom_fec_tx_inc *inc;
+
+       /* Shutdown the task */
+       bcom_disable_task(tsk->tasknum);
+
+       /* Reset the microcode */
+       var = (struct bcom_fec_tx_var *) bcom_task_var(tsk->tasknum);
+       inc = (struct bcom_fec_tx_inc *) bcom_task_inc(tsk->tasknum);
+
+       if (bcom_load_image(tsk->tasknum, bcom_fec_tx_task))
+               return -1;
+
+       var->enable     = bcom_eng->regs_base +
+                               offsetof(struct mpc52xx_sdma, tcr[tsk->tasknum]);
+       var->fifo       = (u32) priv->fifo;
+       var->DRD        = bcom_sram_va2pa(self_modified_drd(tsk->tasknum));
+       var->bd_base    = tsk->bd_pa;
+       var->bd_last    = tsk->bd_pa + ((tsk->num_bd-1) * tsk->bd_size);
+       var->bd_start   = tsk->bd_pa;
+
+       inc->incr_bytes = -(s16)sizeof(u32);    /* These should be in the   */
+       inc->incr_src   = sizeof(u32);          /* task image, but we stick */
+       inc->incr_src_ma= sizeof(u8);           /* to the official ones     */
+
+       /* Reset the BDs */
+       tsk->index = 0;
+       tsk->outdex = 0;
+
+       memset(tsk->bd, 0x00, tsk->num_bd * tsk->bd_size);
+
+       /* Configure some stuff */
+       bcom_set_task_pragma(tsk->tasknum, BCOM_FEC_TX_BD_PRAGMA);
+       bcom_set_task_auto_start(tsk->tasknum, tsk->tasknum);
+
+       out_8(&bcom_eng->regs->ipr[BCOM_INITIATOR_FEC_TX], BCOM_IPR_FEC_TX);
+
+       out_be32(&bcom_eng->regs->IntPend, 1<<tsk->tasknum);    /* Clear ints */
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(bcom_fec_tx_reset);
+
+void
+bcom_fec_tx_release(struct bcom_task *tsk)
+{
+       /* Nothing special for the FEC tasks */
+       bcom_task_free(tsk);
+}
+EXPORT_SYMBOL_GPL(bcom_fec_tx_release);
+
+
+MODULE_DESCRIPTION("BestComm FEC tasks driver");
+MODULE_AUTHOR("Dale Farnsworth <dfarnsworth@mvista.com>");
+MODULE_LICENSE("GPL v2");
+
diff --git a/drivers/dma/bestcomm/gen_bd.c b/drivers/dma/bestcomm/gen_bd.c
new file mode 100644 (file)
index 0000000..1a5b22d
--- /dev/null
@@ -0,0 +1,354 @@
+/*
+ * Driver for MPC52xx processor BestComm General Buffer Descriptor
+ *
+ * Copyright (C) 2007 Sylvain Munaut <tnt@246tNt.com>
+ * Copyright (C) 2006 AppSpec Computer Technologies Corp.
+ *                    Jeff Gibbons <jeff.gibbons@appspec.com>
+ *
+ * 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.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/types.h>
+#include <asm/errno.h>
+#include <asm/io.h>
+
+#include <asm/mpc52xx.h>
+#include <asm/mpc52xx_psc.h>
+
+#include <linux/fsl/bestcomm/bestcomm.h>
+#include <linux/fsl/bestcomm/bestcomm_priv.h>
+#include <linux/fsl/bestcomm/gen_bd.h>
+
+
+/* ======================================================================== */
+/* Task image/var/inc                                                       */
+/* ======================================================================== */
+
+/* gen_bd tasks images */
+extern u32 bcom_gen_bd_rx_task[];
+extern u32 bcom_gen_bd_tx_task[];
+
+/* rx task vars that need to be set before enabling the task */
+struct bcom_gen_bd_rx_var {
+       u32 enable;             /* (u16*) address of task's control register */
+       u32 fifo;               /* (u32*) address of gen_bd's fifo */
+       u32 bd_base;            /* (struct bcom_bd*) beginning of ring buffer */
+       u32 bd_last;            /* (struct bcom_bd*) end of ring buffer */
+       u32 bd_start;           /* (struct bcom_bd*) current bd */
+       u32 buffer_size;        /* size of receive buffer */
+};
+
+/* rx task incs that need to be set before enabling the task */
+struct bcom_gen_bd_rx_inc {
+       u16 pad0;
+       s16 incr_bytes;
+       u16 pad1;
+       s16 incr_dst;
+};
+
+/* tx task vars that need to be set before enabling the task */
+struct bcom_gen_bd_tx_var {
+       u32 fifo;               /* (u32*) address of gen_bd's fifo */
+       u32 enable;             /* (u16*) address of task's control register */
+       u32 bd_base;            /* (struct bcom_bd*) beginning of ring buffer */
+       u32 bd_last;            /* (struct bcom_bd*) end of ring buffer */
+       u32 bd_start;           /* (struct bcom_bd*) current bd */
+       u32 buffer_size;        /* set by uCode for each packet */
+};
+
+/* tx task incs that need to be set before enabling the task */
+struct bcom_gen_bd_tx_inc {
+       u16 pad0;
+       s16 incr_bytes;
+       u16 pad1;
+       s16 incr_src;
+       u16 pad2;
+       s16 incr_src_ma;
+};
+
+/* private structure */
+struct bcom_gen_bd_priv {
+       phys_addr_t     fifo;
+       int             initiator;
+       int             ipr;
+       int             maxbufsize;
+};
+
+
+/* ======================================================================== */
+/* Task support code                                                        */
+/* ======================================================================== */
+
+struct bcom_task *
+bcom_gen_bd_rx_init(int queue_len, phys_addr_t fifo,
+                       int initiator, int ipr, int maxbufsize)
+{
+       struct bcom_task *tsk;
+       struct bcom_gen_bd_priv *priv;
+
+       tsk = bcom_task_alloc(queue_len, sizeof(struct bcom_gen_bd),
+                       sizeof(struct bcom_gen_bd_priv));
+       if (!tsk)
+               return NULL;
+
+       tsk->flags = BCOM_FLAGS_NONE;
+
+       priv = tsk->priv;
+       priv->fifo      = fifo;
+       priv->initiator = initiator;
+       priv->ipr       = ipr;
+       priv->maxbufsize = maxbufsize;
+
+       if (bcom_gen_bd_rx_reset(tsk)) {
+               bcom_task_free(tsk);
+               return NULL;
+       }
+
+       return tsk;
+}
+EXPORT_SYMBOL_GPL(bcom_gen_bd_rx_init);
+
+int
+bcom_gen_bd_rx_reset(struct bcom_task *tsk)
+{
+       struct bcom_gen_bd_priv *priv = tsk->priv;
+       struct bcom_gen_bd_rx_var *var;
+       struct bcom_gen_bd_rx_inc *inc;
+
+       /* Shutdown the task */
+       bcom_disable_task(tsk->tasknum);
+
+       /* Reset the microcode */
+       var = (struct bcom_gen_bd_rx_var *) bcom_task_var(tsk->tasknum);
+       inc = (struct bcom_gen_bd_rx_inc *) bcom_task_inc(tsk->tasknum);
+
+       if (bcom_load_image(tsk->tasknum, bcom_gen_bd_rx_task))
+               return -1;
+
+       var->enable     = bcom_eng->regs_base +
+                               offsetof(struct mpc52xx_sdma, tcr[tsk->tasknum]);
+       var->fifo       = (u32) priv->fifo;
+       var->bd_base    = tsk->bd_pa;
+       var->bd_last    = tsk->bd_pa + ((tsk->num_bd-1) * tsk->bd_size);
+       var->bd_start   = tsk->bd_pa;
+       var->buffer_size = priv->maxbufsize;
+
+       inc->incr_bytes = -(s16)sizeof(u32);
+       inc->incr_dst   = sizeof(u32);
+
+       /* Reset the BDs */
+       tsk->index = 0;
+       tsk->outdex = 0;
+
+       memset(tsk->bd, 0x00, tsk->num_bd * tsk->bd_size);
+
+       /* Configure some stuff */
+       bcom_set_task_pragma(tsk->tasknum, BCOM_GEN_RX_BD_PRAGMA);
+       bcom_set_task_auto_start(tsk->tasknum, tsk->tasknum);
+
+       out_8(&bcom_eng->regs->ipr[priv->initiator], priv->ipr);
+       bcom_set_initiator(tsk->tasknum, priv->initiator);
+
+       out_be32(&bcom_eng->regs->IntPend, 1<<tsk->tasknum);    /* Clear ints */
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(bcom_gen_bd_rx_reset);
+
+void
+bcom_gen_bd_rx_release(struct bcom_task *tsk)
+{
+       /* Nothing special for the GenBD tasks */
+       bcom_task_free(tsk);
+}
+EXPORT_SYMBOL_GPL(bcom_gen_bd_rx_release);
+
+
+extern struct bcom_task *
+bcom_gen_bd_tx_init(int queue_len, phys_addr_t fifo,
+                       int initiator, int ipr)
+{
+       struct bcom_task *tsk;
+       struct bcom_gen_bd_priv *priv;
+
+       tsk = bcom_task_alloc(queue_len, sizeof(struct bcom_gen_bd),
+                       sizeof(struct bcom_gen_bd_priv));
+       if (!tsk)
+               return NULL;
+
+       tsk->flags = BCOM_FLAGS_NONE;
+
+       priv = tsk->priv;
+       priv->fifo      = fifo;
+       priv->initiator = initiator;
+       priv->ipr       = ipr;
+
+       if (bcom_gen_bd_tx_reset(tsk)) {
+               bcom_task_free(tsk);
+               return NULL;
+       }
+
+       return tsk;
+}
+EXPORT_SYMBOL_GPL(bcom_gen_bd_tx_init);
+
+int
+bcom_gen_bd_tx_reset(struct bcom_task *tsk)
+{
+       struct bcom_gen_bd_priv *priv = tsk->priv;
+       struct bcom_gen_bd_tx_var *var;
+       struct bcom_gen_bd_tx_inc *inc;
+
+       /* Shutdown the task */
+       bcom_disable_task(tsk->tasknum);
+
+       /* Reset the microcode */
+       var = (struct bcom_gen_bd_tx_var *) bcom_task_var(tsk->tasknum);
+       inc = (struct bcom_gen_bd_tx_inc *) bcom_task_inc(tsk->tasknum);
+
+       if (bcom_load_image(tsk->tasknum, bcom_gen_bd_tx_task))
+               return -1;
+
+       var->enable     = bcom_eng->regs_base +
+                               offsetof(struct mpc52xx_sdma, tcr[tsk->tasknum]);
+       var->fifo       = (u32) priv->fifo;
+       var->bd_base    = tsk->bd_pa;
+       var->bd_last    = tsk->bd_pa + ((tsk->num_bd-1) * tsk->bd_size);
+       var->bd_start   = tsk->bd_pa;
+
+       inc->incr_bytes = -(s16)sizeof(u32);
+       inc->incr_src   = sizeof(u32);
+       inc->incr_src_ma = sizeof(u8);
+
+       /* Reset the BDs */
+       tsk->index = 0;
+       tsk->outdex = 0;
+
+       memset(tsk->bd, 0x00, tsk->num_bd * tsk->bd_size);
+
+       /* Configure some stuff */
+       bcom_set_task_pragma(tsk->tasknum, BCOM_GEN_TX_BD_PRAGMA);
+       bcom_set_task_auto_start(tsk->tasknum, tsk->tasknum);
+
+       out_8(&bcom_eng->regs->ipr[priv->initiator], priv->ipr);
+       bcom_set_initiator(tsk->tasknum, priv->initiator);
+
+       out_be32(&bcom_eng->regs->IntPend, 1<<tsk->tasknum);    /* Clear ints */
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(bcom_gen_bd_tx_reset);
+
+void
+bcom_gen_bd_tx_release(struct bcom_task *tsk)
+{
+       /* Nothing special for the GenBD tasks */
+       bcom_task_free(tsk);
+}
+EXPORT_SYMBOL_GPL(bcom_gen_bd_tx_release);
+
+/* ---------------------------------------------------------------------
+ * PSC support code
+ */
+
+/**
+ * bcom_psc_parameters - Bestcomm initialization value table for PSC devices
+ *
+ * This structure is only used internally.  It is a lookup table for PSC
+ * specific parameters to bestcomm tasks.
+ */
+static struct bcom_psc_params {
+       int rx_initiator;
+       int rx_ipr;
+       int tx_initiator;
+       int tx_ipr;
+} bcom_psc_params[] = {
+       [0] = {
+               .rx_initiator = BCOM_INITIATOR_PSC1_RX,
+               .rx_ipr = BCOM_IPR_PSC1_RX,
+               .tx_initiator = BCOM_INITIATOR_PSC1_TX,
+               .tx_ipr = BCOM_IPR_PSC1_TX,
+       },
+       [1] = {
+               .rx_initiator = BCOM_INITIATOR_PSC2_RX,
+               .rx_ipr = BCOM_IPR_PSC2_RX,
+               .tx_initiator = BCOM_INITIATOR_PSC2_TX,
+               .tx_ipr = BCOM_IPR_PSC2_TX,
+       },
+       [2] = {
+               .rx_initiator = BCOM_INITIATOR_PSC3_RX,
+               .rx_ipr = BCOM_IPR_PSC3_RX,
+               .tx_initiator = BCOM_INITIATOR_PSC3_TX,
+               .tx_ipr = BCOM_IPR_PSC3_TX,
+       },
+       [3] = {
+               .rx_initiator = BCOM_INITIATOR_PSC4_RX,
+               .rx_ipr = BCOM_IPR_PSC4_RX,
+               .tx_initiator = BCOM_INITIATOR_PSC4_TX,
+               .tx_ipr = BCOM_IPR_PSC4_TX,
+       },
+       [4] = {
+               .rx_initiator = BCOM_INITIATOR_PSC5_RX,
+               .rx_ipr = BCOM_IPR_PSC5_RX,
+               .tx_initiator = BCOM_INITIATOR_PSC5_TX,
+               .tx_ipr = BCOM_IPR_PSC5_TX,
+       },
+       [5] = {
+               .rx_initiator = BCOM_INITIATOR_PSC6_RX,
+               .rx_ipr = BCOM_IPR_PSC6_RX,
+               .tx_initiator = BCOM_INITIATOR_PSC6_TX,
+               .tx_ipr = BCOM_IPR_PSC6_TX,
+       },
+};
+
+/**
+ * bcom_psc_gen_bd_rx_init - Allocate a receive bcom_task for a PSC port
+ * @psc_num:   Number of the PSC to allocate a task for
+ * @queue_len: number of buffer descriptors to allocate for the task
+ * @fifo:      physical address of FIFO register
+ * @maxbufsize:        Maximum receive data size in bytes.
+ *
+ * Allocate a bestcomm task structure for receiving data from a PSC.
+ */
+struct bcom_task * bcom_psc_gen_bd_rx_init(unsigned psc_num, int queue_len,
+                                          phys_addr_t fifo, int maxbufsize)
+{
+       if (psc_num >= MPC52xx_PSC_MAXNUM)
+               return NULL;
+
+       return bcom_gen_bd_rx_init(queue_len, fifo,
+                                  bcom_psc_params[psc_num].rx_initiator,
+                                  bcom_psc_params[psc_num].rx_ipr,
+                                  maxbufsize);
+}
+EXPORT_SYMBOL_GPL(bcom_psc_gen_bd_rx_init);
+
+/**
+ * bcom_psc_gen_bd_tx_init - Allocate a transmit bcom_task for a PSC port
+ * @psc_num:   Number of the PSC to allocate a task for
+ * @queue_len: number of buffer descriptors to allocate for the task
+ * @fifo:      physical address of FIFO register
+ *
+ * Allocate a bestcomm task structure for transmitting data to a PSC.
+ */
+struct bcom_task *
+bcom_psc_gen_bd_tx_init(unsigned psc_num, int queue_len, phys_addr_t fifo)
+{
+       struct psc;
+       return bcom_gen_bd_tx_init(queue_len, fifo,
+                                  bcom_psc_params[psc_num].tx_initiator,
+                                  bcom_psc_params[psc_num].tx_ipr);
+}
+EXPORT_SYMBOL_GPL(bcom_psc_gen_bd_tx_init);
+
+
+MODULE_DESCRIPTION("BestComm General Buffer Descriptor tasks driver");
+MODULE_AUTHOR("Jeff Gibbons <jeff.gibbons@appspec.com>");
+MODULE_LICENSE("GPL v2");
+
diff --git a/drivers/dma/bestcomm/sram.c b/drivers/dma/bestcomm/sram.c
new file mode 100644 (file)
index 0000000..5e2ed30
--- /dev/null
@@ -0,0 +1,178 @@
+/*
+ * Simple memory allocator for on-board SRAM
+ *
+ *
+ * Maintainer : Sylvain Munaut <tnt@246tNt.com>
+ *
+ * Copyright (C) 2005 Sylvain Munaut <tnt@246tNt.com>
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+#include <linux/err.h>
+#include <linux/kernel.h>
+#include <linux/export.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/string.h>
+#include <linux/ioport.h>
+#include <linux/of.h>
+
+#include <asm/io.h>
+#include <asm/mmu.h>
+
+#include <linux/fsl/bestcomm/sram.h>
+
+
+/* Struct keeping our 'state' */
+struct bcom_sram *bcom_sram = NULL;
+EXPORT_SYMBOL_GPL(bcom_sram);  /* needed for inline functions */
+
+
+/* ======================================================================== */
+/* Public API                                                               */
+/* ======================================================================== */
+/* DO NOT USE in interrupts, if needed in irq handler, we should use the
+   _irqsave version of the spin_locks */
+
+int bcom_sram_init(struct device_node *sram_node, char *owner)
+{
+       int rv;
+       const u32 *regaddr_p;
+       u64 regaddr64, size64;
+       unsigned int psize;
+
+       /* Create our state struct */
+       if (bcom_sram) {
+               printk(KERN_ERR "%s: bcom_sram_init: "
+                       "Already initialized !\n", owner);
+               return -EBUSY;
+       }
+
+       bcom_sram = kmalloc(sizeof(struct bcom_sram), GFP_KERNEL);
+       if (!bcom_sram) {
+               printk(KERN_ERR "%s: bcom_sram_init: "
+                       "Couldn't allocate internal state !\n", owner);
+               return -ENOMEM;
+       }
+
+       /* Get address and size of the sram */
+       regaddr_p = of_get_address(sram_node, 0, &size64, NULL);
+       if (!regaddr_p) {
+               printk(KERN_ERR "%s: bcom_sram_init: "
+                       "Invalid device node !\n", owner);
+               rv = -EINVAL;
+               goto error_free;
+       }
+
+       regaddr64 = of_translate_address(sram_node, regaddr_p);
+
+       bcom_sram->base_phys = (phys_addr_t) regaddr64;
+       bcom_sram->size = (unsigned int) size64;
+
+       /* Request region */
+       if (!request_mem_region(bcom_sram->base_phys, bcom_sram->size, owner)) {
+               printk(KERN_ERR "%s: bcom_sram_init: "
+                       "Couldn't request region !\n", owner);
+               rv = -EBUSY;
+               goto error_free;
+       }
+
+       /* Map SRAM */
+               /* sram is not really __iomem */
+       bcom_sram->base_virt = (void*) ioremap(bcom_sram->base_phys, bcom_sram->size);
+
+       if (!bcom_sram->base_virt) {
+               printk(KERN_ERR "%s: bcom_sram_init: "
+                       "Map error SRAM zone 0x%08lx (0x%0x)!\n",
+                       owner, (long)bcom_sram->base_phys, bcom_sram->size );
+               rv = -ENOMEM;
+               goto error_release;
+       }
+
+       /* Create an rheap (defaults to 32 bits word alignment) */
+       bcom_sram->rh = rh_create(4);
+
+       /* Attach the free zones */
+#if 0
+       /* Currently disabled ... for future use only */
+       reg_addr_p = of_get_property(sram_node, "available", &psize);
+#else
+       regaddr_p = NULL;
+       psize = 0;
+#endif
+
+       if (!regaddr_p || !psize) {
+               /* Attach the whole zone */
+               rh_attach_region(bcom_sram->rh, 0, bcom_sram->size);
+       } else {
+               /* Attach each zone independently */
+               while (psize >= 2 * sizeof(u32)) {
+                       phys_addr_t zbase = of_translate_address(sram_node, regaddr_p);
+                       rh_attach_region(bcom_sram->rh, zbase - bcom_sram->base_phys, regaddr_p[1]);
+                       regaddr_p += 2;
+                       psize -= 2 * sizeof(u32);
+               }
+       }
+
+       /* Init our spinlock */
+       spin_lock_init(&bcom_sram->lock);
+
+       return 0;
+
+error_release:
+       release_mem_region(bcom_sram->base_phys, bcom_sram->size);
+error_free:
+       kfree(bcom_sram);
+       bcom_sram = NULL;
+
+       return rv;
+}
+EXPORT_SYMBOL_GPL(bcom_sram_init);
+
+void bcom_sram_cleanup(void)
+{
+       /* Free resources */
+       if (bcom_sram) {
+               rh_destroy(bcom_sram->rh);
+               iounmap((void __iomem *)bcom_sram->base_virt);
+               release_mem_region(bcom_sram->base_phys, bcom_sram->size);
+               kfree(bcom_sram);
+               bcom_sram = NULL;
+       }
+}
+EXPORT_SYMBOL_GPL(bcom_sram_cleanup);
+
+void* bcom_sram_alloc(int size, int align, phys_addr_t *phys)
+{
+       unsigned long offset;
+
+       spin_lock(&bcom_sram->lock);
+       offset = rh_alloc_align(bcom_sram->rh, size, align, NULL);
+       spin_unlock(&bcom_sram->lock);
+
+       if (IS_ERR_VALUE(offset))
+               return NULL;
+
+       *phys = bcom_sram->base_phys + offset;
+       return bcom_sram->base_virt + offset;
+}
+EXPORT_SYMBOL_GPL(bcom_sram_alloc);
+
+void bcom_sram_free(void *ptr)
+{
+       unsigned long offset;
+
+       if (!ptr)
+               return;
+
+       offset = ptr - bcom_sram->base_virt;
+
+       spin_lock(&bcom_sram->lock);
+       rh_free(bcom_sram->rh, offset);
+       spin_unlock(&bcom_sram->lock);
+}
+EXPORT_SYMBOL_GPL(bcom_sram_free);
+
index 817d081d2cd8e8b9d2fdddfc4a69edb3dc6d7b32..85e776d500a6f092fa86fd815e3392371072867f 100644 (file)
@@ -40,8 +40,8 @@
 #include <asm/delay.h>
 #include <asm/mpc52xx.h>
 
-#include <sysdev/bestcomm/bestcomm.h>
-#include <sysdev/bestcomm/fec.h>
+#include <linux/fsl/bestcomm/bestcomm.h>
+#include <linux/fsl/bestcomm/fec.h>
 
 #include "fec_mpc52xx.h"
 
index 19cfd7a925638f305c7e349490ade67cf6dd425c..41fbd9453c5fa5611406b25477073174efd0b2d5 100644 (file)
@@ -944,7 +944,7 @@ static u32 fsl_diu_get_pixel_format(unsigned int bits_per_pixel)
 #define PF_COMP_0_MASK         0x0000000F
 #define PF_COMP_0_SHIFT                0
 
-#define MAKE_PF(alpha, red, blue, green, size, c0, c1, c2, c3) \
+#define MAKE_PF(alpha, red, green, blue, size, c0, c1, c2, c3) \
        cpu_to_le32(PF_BYTE_F | (alpha << PF_ALPHA_C_SHIFT) | \
        (blue << PF_BLUE_C_SHIFT) | (green << PF_GREEN_C_SHIFT) | \
        (red << PF_RED_C_SHIFT) | (c3 << PF_COMP_3_SHIFT) | \
@@ -954,10 +954,10 @@ static u32 fsl_diu_get_pixel_format(unsigned int bits_per_pixel)
        switch (bits_per_pixel) {
        case 32:
                /* 0x88883316 */
-               return MAKE_PF(3, 2, 0, 1, 3, 8, 8, 8, 8);
+               return MAKE_PF(3, 2, 1, 0, 3, 8, 8, 8, 8);
        case 24:
                /* 0x88082219 */
-               return MAKE_PF(4, 0, 1, 2, 2, 0, 8, 8, 8);
+               return MAKE_PF(4, 0, 1, 2, 2, 8, 8, 8, 0);
        case 16:
                /* 0x65053118 */
                return MAKE_PF(4, 2, 1, 0, 1, 5, 6, 5, 0);
@@ -1232,6 +1232,16 @@ static int fsl_diu_ioctl(struct fb_info *info, unsigned int cmd,
        return 0;
 }
 
+static inline void fsl_diu_enable_interrupts(struct fsl_diu_data *data)
+{
+       u32 int_mask = INT_UNDRUN; /* enable underrun detection */
+
+       if (IS_ENABLED(CONFIG_NOT_COHERENT_CACHE))
+               int_mask |= INT_VSYNC; /* enable vertical sync */
+
+       clrbits32(&data->diu_reg->int_mask, int_mask);
+}
+
 /* turn on fb if count == 1
  */
 static int fsl_diu_open(struct fb_info *info, int user)
@@ -1251,19 +1261,7 @@ static int fsl_diu_open(struct fb_info *info, int user)
                if (res < 0)
                        mfbi->count--;
                else {
-                       struct fsl_diu_data *data = mfbi->parent;
-
-#ifdef CONFIG_NOT_COHERENT_CACHE
-                       /*
-                        * Enable underrun detection and vertical sync
-                        * interrupts.
-                        */
-                       clrbits32(&data->diu_reg->int_mask,
-                                 INT_UNDRUN | INT_VSYNC);
-#else
-                       /* Enable underrun detection */
-                       clrbits32(&data->diu_reg->int_mask, INT_UNDRUN);
-#endif
+                       fsl_diu_enable_interrupts(mfbi->parent);
                        fsl_diu_enable_panel(info);
                }
        }
@@ -1283,9 +1281,18 @@ static int fsl_diu_release(struct fb_info *info, int user)
        mfbi->count--;
        if (mfbi->count == 0) {
                struct fsl_diu_data *data = mfbi->parent;
+               bool disable = true;
+               int i;
 
-               /* Disable interrupts */
-               out_be32(&data->diu_reg->int_mask, 0xffffffff);
+               /* Disable interrupts only if all AOIs are closed */
+               for (i = 0; i < NUM_AOIS; i++) {
+                       struct mfb_info *mi = data->fsl_diu_info[i].par;
+
+                       if (mi->count)
+                               disable = false;
+               }
+               if (disable)
+                       out_be32(&data->diu_reg->int_mask, 0xffffffff);
                fsl_diu_disable_panel(info);
        }
 
@@ -1614,14 +1621,6 @@ static int fsl_diu_probe(struct platform_device *pdev)
        out_be32(&data->diu_reg->desc[1], data->dummy_ad.paddr);
        out_be32(&data->diu_reg->desc[2], data->dummy_ad.paddr);
 
-       for (i = 0; i < NUM_AOIS; i++) {
-               ret = install_fb(&data->fsl_diu_info[i]);
-               if (ret) {
-                       dev_err(&pdev->dev, "could not register fb %d\n", i);
-                       goto error;
-               }
-       }
-
        /*
         * Older versions of U-Boot leave interrupts enabled, so disable
         * all of them and clear the status register.
@@ -1630,12 +1629,21 @@ static int fsl_diu_probe(struct platform_device *pdev)
        in_be32(&data->diu_reg->int_status);
 
        ret = request_irq(data->irq, fsl_diu_isr, 0, "fsl-diu-fb",
-                         &data->diu_reg);
+                         data->diu_reg);
        if (ret) {
                dev_err(&pdev->dev, "could not claim irq\n");
                goto error;
        }
 
+       for (i = 0; i < NUM_AOIS; i++) {
+               ret = install_fb(&data->fsl_diu_info[i]);
+               if (ret) {
+                       dev_err(&pdev->dev, "could not register fb %d\n", i);
+                       free_irq(data->irq, data->diu_reg);
+                       goto error;
+               }
+       }
+
        sysfs_attr_init(&data->dev_attr.attr);
        data->dev_attr.attr.name = "monitor";
        data->dev_attr.attr.mode = S_IRUGO|S_IWUSR;
@@ -1667,7 +1675,7 @@ static int fsl_diu_remove(struct platform_device *pdev)
        data = dev_get_drvdata(&pdev->dev);
        disable_lcdc(&data->fsl_diu_info[0]);
 
-       free_irq(data->irq, &data->diu_reg);
+       free_irq(data->irq, data->diu_reg);
 
        for (i = 0; i < NUM_AOIS; i++)
                uninstall_fb(&data->fsl_diu_info[i]);
diff --git a/include/linux/fsl/bestcomm/ata.h b/include/linux/fsl/bestcomm/ata.h
new file mode 100644 (file)
index 0000000..0b23718
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Header for Bestcomm ATA task driver
+ *
+ *
+ * Copyright (C) 2006 Freescale - John Rigby
+ * Copyright (C) 2006 Sylvain Munaut <tnt@246tNt.com>
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+#ifndef __BESTCOMM_ATA_H__
+#define __BESTCOMM_ATA_H__
+
+
+struct bcom_ata_bd {
+       u32     status;
+       u32     src_pa;
+       u32     dst_pa;
+};
+
+extern struct bcom_task * bcom_ata_init(int queue_len, int maxbufsize);
+extern void bcom_ata_rx_prepare(struct bcom_task *tsk);
+extern void bcom_ata_tx_prepare(struct bcom_task *tsk);
+extern void bcom_ata_reset_bd(struct bcom_task *tsk);
+extern void bcom_ata_release(struct bcom_task *tsk);
+
+#endif /* __BESTCOMM_ATA_H__ */
+
diff --git a/include/linux/fsl/bestcomm/bestcomm.h b/include/linux/fsl/bestcomm/bestcomm.h
new file mode 100644 (file)
index 0000000..a0e2e6b
--- /dev/null
@@ -0,0 +1,213 @@
+/*
+ * Public header for the MPC52xx processor BestComm driver
+ *
+ *
+ * Copyright (C) 2006      Sylvain Munaut <tnt@246tNt.com>
+ * Copyright (C) 2005      Varma Electronics Oy,
+ *                         ( by Andrey Volkov <avolkov@varma-el.com> )
+ * Copyright (C) 2003-2004 MontaVista, Software, Inc.
+ *                         ( by Dale Farnsworth <dfarnsworth@mvista.com> )
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+#ifndef __BESTCOMM_H__
+#define __BESTCOMM_H__
+
+/**
+ * struct bcom_bd - Structure describing a generic BestComm buffer descriptor
+ * @status: The current status of this buffer. Exact meaning depends on the
+ *          task type
+ * @data: An array of u32 extra data.  Size of array is task dependent.
+ *
+ * Note: Don't dereference a bcom_bd pointer as an array.  The size of the
+ *       bcom_bd is variable.  Use bcom_get_bd() instead.
+ */
+struct bcom_bd {
+       u32     status;
+       u32     data[0];        /* variable payload size */
+};
+
+/* ======================================================================== */
+/* Generic task management                                                   */
+/* ======================================================================== */
+
+/**
+ * struct bcom_task - Structure describing a loaded BestComm task
+ *
+ * This structure is never built by the driver it self. It's built and
+ * filled the intermediate layer of the BestComm API, the task dependent
+ * support code.
+ *
+ * Most likely you don't need to poke around inside this structure. The
+ * fields are exposed in the header just for the sake of inline functions
+ */
+struct bcom_task {
+       unsigned int    tasknum;
+       unsigned int    flags;
+       int             irq;
+
+       struct bcom_bd  *bd;
+       phys_addr_t     bd_pa;
+       void            **cookie;
+       unsigned short  index;
+       unsigned short  outdex;
+       unsigned int    num_bd;
+       unsigned int    bd_size;
+
+       void*           priv;
+};
+
+#define BCOM_FLAGS_NONE         0x00000000ul
+#define BCOM_FLAGS_ENABLE_TASK  (1ul <<  0)
+
+/**
+ * bcom_enable - Enable a BestComm task
+ * @tsk: The BestComm task structure
+ *
+ * This function makes sure the given task is enabled and can be run
+ * by the BestComm engine as needed
+ */
+extern void bcom_enable(struct bcom_task *tsk);
+
+/**
+ * bcom_disable - Disable a BestComm task
+ * @tsk: The BestComm task structure
+ *
+ * This function disable a given task, making sure it's not executed
+ * by the BestComm engine.
+ */
+extern void bcom_disable(struct bcom_task *tsk);
+
+
+/**
+ * bcom_get_task_irq - Returns the irq number of a BestComm task
+ * @tsk: The BestComm task structure
+ */
+static inline int
+bcom_get_task_irq(struct bcom_task *tsk) {
+       return tsk->irq;
+}
+
+/* ======================================================================== */
+/* BD based tasks helpers                                                   */
+/* ======================================================================== */
+
+#define BCOM_BD_READY  0x40000000ul
+
+/** _bcom_next_index - Get next input index.
+ * @tsk: pointer to task structure
+ *
+ * Support function; Device drivers should not call this
+ */
+static inline int
+_bcom_next_index(struct bcom_task *tsk)
+{
+       return ((tsk->index + 1) == tsk->num_bd) ? 0 : tsk->index + 1;
+}
+
+/** _bcom_next_outdex - Get next output index.
+ * @tsk: pointer to task structure
+ *
+ * Support function; Device drivers should not call this
+ */
+static inline int
+_bcom_next_outdex(struct bcom_task *tsk)
+{
+       return ((tsk->outdex + 1) == tsk->num_bd) ? 0 : tsk->outdex + 1;
+}
+
+/**
+ * bcom_queue_empty - Checks if a BestComm task BD queue is empty
+ * @tsk: The BestComm task structure
+ */
+static inline int
+bcom_queue_empty(struct bcom_task *tsk)
+{
+       return tsk->index == tsk->outdex;
+}
+
+/**
+ * bcom_queue_full - Checks if a BestComm task BD queue is full
+ * @tsk: The BestComm task structure
+ */
+static inline int
+bcom_queue_full(struct bcom_task *tsk)
+{
+       return tsk->outdex == _bcom_next_index(tsk);
+}
+
+/**
+ * bcom_get_bd - Get a BD from the queue
+ * @tsk: The BestComm task structure
+ * index: Index of the BD to fetch
+ */
+static inline struct bcom_bd
+*bcom_get_bd(struct bcom_task *tsk, unsigned int index)
+{
+       /* A cast to (void*) so the address can be incremented by the
+        * real size instead of by sizeof(struct bcom_bd) */
+       return ((void *)tsk->bd) + (index * tsk->bd_size);
+}
+
+/**
+ * bcom_buffer_done - Checks if a BestComm 
+ * @tsk: The BestComm task structure
+ */
+static inline int
+bcom_buffer_done(struct bcom_task *tsk)
+{
+       struct bcom_bd *bd;
+       if (bcom_queue_empty(tsk))
+               return 0;
+
+       bd = bcom_get_bd(tsk, tsk->outdex);
+       return !(bd->status & BCOM_BD_READY);
+}
+
+/**
+ * bcom_prepare_next_buffer - clear status of next available buffer.
+ * @tsk: The BestComm task structure
+ *
+ * Returns pointer to next buffer descriptor
+ */
+static inline struct bcom_bd *
+bcom_prepare_next_buffer(struct bcom_task *tsk)
+{
+       struct bcom_bd *bd;
+
+       bd = bcom_get_bd(tsk, tsk->index);
+       bd->status = 0; /* cleanup last status */
+       return bd;
+}
+
+static inline void
+bcom_submit_next_buffer(struct bcom_task *tsk, void *cookie)
+{
+       struct bcom_bd *bd = bcom_get_bd(tsk, tsk->index);
+
+       tsk->cookie[tsk->index] = cookie;
+       mb();   /* ensure the bd is really up-to-date */
+       bd->status |= BCOM_BD_READY;
+       tsk->index = _bcom_next_index(tsk);
+       if (tsk->flags & BCOM_FLAGS_ENABLE_TASK)
+               bcom_enable(tsk);
+}
+
+static inline void *
+bcom_retrieve_buffer(struct bcom_task *tsk, u32 *p_status, struct bcom_bd **p_bd)
+{
+       void *cookie = tsk->cookie[tsk->outdex];
+       struct bcom_bd *bd = bcom_get_bd(tsk, tsk->outdex);
+
+       if (p_status)
+               *p_status = bd->status;
+       if (p_bd)
+               *p_bd = bd;
+       tsk->outdex = _bcom_next_outdex(tsk);
+       return cookie;
+}
+
+#endif /* __BESTCOMM_H__ */
diff --git a/include/linux/fsl/bestcomm/bestcomm_priv.h b/include/linux/fsl/bestcomm/bestcomm_priv.h
new file mode 100644 (file)
index 0000000..3b52f3f
--- /dev/null
@@ -0,0 +1,350 @@
+/*
+ * Private header for the MPC52xx processor BestComm driver
+ *
+ * By private, we mean that driver should not use it directly. It's meant
+ * to be used by the BestComm engine driver itself and by the intermediate
+ * layer between the core and the drivers.
+ *
+ * Copyright (C) 2006      Sylvain Munaut <tnt@246tNt.com>
+ * Copyright (C) 2005      Varma Electronics Oy,
+ *                         ( by Andrey Volkov <avolkov@varma-el.com> )
+ * Copyright (C) 2003-2004 MontaVista, Software, Inc.
+ *                         ( by Dale Farnsworth <dfarnsworth@mvista.com> )
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+#ifndef __BESTCOMM_PRIV_H__
+#define __BESTCOMM_PRIV_H__
+
+#include <linux/spinlock.h>
+#include <linux/of.h>
+#include <asm/io.h>
+#include <asm/mpc52xx.h>
+
+#include "sram.h"
+
+
+/* ======================================================================== */
+/* Engine related stuff                                                     */
+/* ======================================================================== */
+
+/* Zones sizes and needed alignments */
+#define BCOM_MAX_TASKS         16
+#define BCOM_MAX_VAR           24
+#define BCOM_MAX_INC           8
+#define BCOM_MAX_FDT           64
+#define BCOM_MAX_CTX           20
+#define BCOM_CTX_SIZE          (BCOM_MAX_CTX * sizeof(u32))
+#define BCOM_CTX_ALIGN         0x100
+#define BCOM_VAR_SIZE          (BCOM_MAX_VAR * sizeof(u32))
+#define BCOM_INC_SIZE          (BCOM_MAX_INC * sizeof(u32))
+#define BCOM_VAR_ALIGN         0x80
+#define BCOM_FDT_SIZE          (BCOM_MAX_FDT * sizeof(u32))
+#define BCOM_FDT_ALIGN         0x100
+
+/**
+ * struct bcom_tdt - Task Descriptor Table Entry
+ *
+ */
+struct bcom_tdt {
+       u32 start;
+       u32 stop;
+       u32 var;
+       u32 fdt;
+       u32 exec_status;        /* used internally by BestComm engine */
+       u32 mvtp;               /* used internally by BestComm engine */
+       u32 context;
+       u32 litbase;
+};
+
+/**
+ * struct bcom_engine
+ *
+ * This holds all info needed globaly to handle the engine
+ */
+struct bcom_engine {
+       struct device_node              *ofnode;
+       struct mpc52xx_sdma __iomem     *regs;
+       phys_addr_t                      regs_base;
+
+       struct bcom_tdt                 *tdt;
+       u32                             *ctx;
+       u32                             *var;
+       u32                             *fdt;
+
+       spinlock_t                      lock;
+};
+
+extern struct bcom_engine *bcom_eng;
+
+
+/* ======================================================================== */
+/* Tasks related stuff                                                      */
+/* ======================================================================== */
+
+/* Tasks image header */
+#define BCOM_TASK_MAGIC                0x4243544B      /* 'BCTK' */
+
+struct bcom_task_header {
+       u32     magic;
+       u8      desc_size;      /* the size fields     */
+       u8      var_size;       /* are given in number */
+       u8      inc_size;       /* of 32-bits words    */
+       u8      first_var;
+       u8      reserved[8];
+};
+
+/* Descriptors structure & co */
+#define BCOM_DESC_NOP          0x000001f8
+#define BCOM_LCD_MASK          0x80000000
+#define BCOM_DRD_EXTENDED      0x40000000
+#define BCOM_DRD_INITIATOR_SHIFT       21
+
+/* Tasks pragma */
+#define BCOM_PRAGMA_BIT_RSV            7       /* reserved pragma bit */
+#define BCOM_PRAGMA_BIT_PRECISE_INC    6       /* increment 0=when possible, */
+                                               /*           1=iter end */
+#define BCOM_PRAGMA_BIT_RST_ERROR_NO   5       /* don't reset errors on */
+                                               /* task enable */
+#define BCOM_PRAGMA_BIT_PACK           4       /* pack data enable */
+#define BCOM_PRAGMA_BIT_INTEGER                3       /* data alignment */
+                                               /* 0=frac(msb), 1=int(lsb) */
+#define BCOM_PRAGMA_BIT_SPECREAD       2       /* XLB speculative read */
+#define BCOM_PRAGMA_BIT_CW             1       /* write line buffer enable */
+#define BCOM_PRAGMA_BIT_RL             0       /* read line buffer enable */
+
+       /* Looks like XLB speculative read generates XLB errors when a buffer
+        * is at the end of the physical memory. i.e. when accessing the
+        * lasts words, the engine tries to prefetch the next but there is no
+        * next ...
+        */
+#define BCOM_STD_PRAGMA                ((0 << BCOM_PRAGMA_BIT_RSV)             | \
+                                (0 << BCOM_PRAGMA_BIT_PRECISE_INC)     | \
+                                (0 << BCOM_PRAGMA_BIT_RST_ERROR_NO)    | \
+                                (0 << BCOM_PRAGMA_BIT_PACK)            | \
+                                (0 << BCOM_PRAGMA_BIT_INTEGER)         | \
+                                (0 << BCOM_PRAGMA_BIT_SPECREAD)        | \
+                                (1 << BCOM_PRAGMA_BIT_CW)              | \
+                                (1 << BCOM_PRAGMA_BIT_RL))
+
+#define BCOM_PCI_PRAGMA                ((0 << BCOM_PRAGMA_BIT_RSV)             | \
+                                (0 << BCOM_PRAGMA_BIT_PRECISE_INC)     | \
+                                (0 << BCOM_PRAGMA_BIT_RST_ERROR_NO)    | \
+                                (0 << BCOM_PRAGMA_BIT_PACK)            | \
+                                (1 << BCOM_PRAGMA_BIT_INTEGER)         | \
+                                (0 << BCOM_PRAGMA_BIT_SPECREAD)        | \
+                                (1 << BCOM_PRAGMA_BIT_CW)              | \
+                                (1 << BCOM_PRAGMA_BIT_RL))
+
+#define BCOM_ATA_PRAGMA                BCOM_STD_PRAGMA
+#define BCOM_CRC16_DP_0_PRAGMA BCOM_STD_PRAGMA
+#define BCOM_CRC16_DP_1_PRAGMA BCOM_STD_PRAGMA
+#define BCOM_FEC_RX_BD_PRAGMA  BCOM_STD_PRAGMA
+#define BCOM_FEC_TX_BD_PRAGMA  BCOM_STD_PRAGMA
+#define BCOM_GEN_DP_0_PRAGMA   BCOM_STD_PRAGMA
+#define BCOM_GEN_DP_1_PRAGMA   BCOM_STD_PRAGMA
+#define BCOM_GEN_DP_2_PRAGMA   BCOM_STD_PRAGMA
+#define BCOM_GEN_DP_3_PRAGMA   BCOM_STD_PRAGMA
+#define BCOM_GEN_DP_BD_0_PRAGMA        BCOM_STD_PRAGMA
+#define BCOM_GEN_DP_BD_1_PRAGMA        BCOM_STD_PRAGMA
+#define BCOM_GEN_RX_BD_PRAGMA  BCOM_STD_PRAGMA
+#define BCOM_GEN_TX_BD_PRAGMA  BCOM_STD_PRAGMA
+#define BCOM_GEN_LPC_PRAGMA    BCOM_STD_PRAGMA
+#define BCOM_PCI_RX_PRAGMA     BCOM_PCI_PRAGMA
+#define BCOM_PCI_TX_PRAGMA     BCOM_PCI_PRAGMA
+
+/* Initiators number */
+#define BCOM_INITIATOR_ALWAYS   0
+#define BCOM_INITIATOR_SCTMR_0  1
+#define BCOM_INITIATOR_SCTMR_1  2
+#define BCOM_INITIATOR_FEC_RX   3
+#define BCOM_INITIATOR_FEC_TX   4
+#define BCOM_INITIATOR_ATA_RX   5
+#define BCOM_INITIATOR_ATA_TX   6
+#define BCOM_INITIATOR_SCPCI_RX         7
+#define BCOM_INITIATOR_SCPCI_TX         8
+#define BCOM_INITIATOR_PSC3_RX  9
+#define BCOM_INITIATOR_PSC3_TX 10
+#define BCOM_INITIATOR_PSC2_RX 11
+#define BCOM_INITIATOR_PSC2_TX 12
+#define BCOM_INITIATOR_PSC1_RX 13
+#define BCOM_INITIATOR_PSC1_TX 14
+#define BCOM_INITIATOR_SCTMR_2 15
+#define BCOM_INITIATOR_SCLPC   16
+#define BCOM_INITIATOR_PSC5_RX 17
+#define BCOM_INITIATOR_PSC5_TX 18
+#define BCOM_INITIATOR_PSC4_RX 19
+#define BCOM_INITIATOR_PSC4_TX 20
+#define BCOM_INITIATOR_I2C2_RX 21
+#define BCOM_INITIATOR_I2C2_TX 22
+#define BCOM_INITIATOR_I2C1_RX 23
+#define BCOM_INITIATOR_I2C1_TX 24
+#define BCOM_INITIATOR_PSC6_RX 25
+#define BCOM_INITIATOR_PSC6_TX 26
+#define BCOM_INITIATOR_IRDA_RX 25
+#define BCOM_INITIATOR_IRDA_TX 26
+#define BCOM_INITIATOR_SCTMR_3 27
+#define BCOM_INITIATOR_SCTMR_4 28
+#define BCOM_INITIATOR_SCTMR_5 29
+#define BCOM_INITIATOR_SCTMR_6 30
+#define BCOM_INITIATOR_SCTMR_7 31
+
+/* Initiators priorities */
+#define BCOM_IPR_ALWAYS                7
+#define BCOM_IPR_SCTMR_0       2
+#define BCOM_IPR_SCTMR_1       2
+#define BCOM_IPR_FEC_RX                6
+#define BCOM_IPR_FEC_TX                5
+#define BCOM_IPR_ATA_RX                7
+#define BCOM_IPR_ATA_TX                7
+#define BCOM_IPR_SCPCI_RX      2
+#define BCOM_IPR_SCPCI_TX      2
+#define BCOM_IPR_PSC3_RX       2
+#define BCOM_IPR_PSC3_TX       2
+#define BCOM_IPR_PSC2_RX       2
+#define BCOM_IPR_PSC2_TX       2
+#define BCOM_IPR_PSC1_RX       2
+#define BCOM_IPR_PSC1_TX       2
+#define BCOM_IPR_SCTMR_2       2
+#define BCOM_IPR_SCLPC         2
+#define BCOM_IPR_PSC5_RX       2
+#define BCOM_IPR_PSC5_TX       2
+#define BCOM_IPR_PSC4_RX       2
+#define BCOM_IPR_PSC4_TX       2
+#define BCOM_IPR_I2C2_RX       2
+#define BCOM_IPR_I2C2_TX       2
+#define BCOM_IPR_I2C1_RX       2
+#define BCOM_IPR_I2C1_TX       2
+#define BCOM_IPR_PSC6_RX       2
+#define BCOM_IPR_PSC6_TX       2
+#define BCOM_IPR_IRDA_RX       2
+#define BCOM_IPR_IRDA_TX       2
+#define BCOM_IPR_SCTMR_3       2
+#define BCOM_IPR_SCTMR_4       2
+#define BCOM_IPR_SCTMR_5       2
+#define BCOM_IPR_SCTMR_6       2
+#define BCOM_IPR_SCTMR_7       2
+
+
+/* ======================================================================== */
+/* API                                                                      */
+/* ======================================================================== */
+
+extern struct bcom_task *bcom_task_alloc(int bd_count, int bd_size, int priv_size);
+extern void bcom_task_free(struct bcom_task *tsk);
+extern int bcom_load_image(int task, u32 *task_image);
+extern void bcom_set_initiator(int task, int initiator);
+
+
+#define TASK_ENABLE             0x8000
+
+/**
+ * bcom_disable_prefetch - Hook to disable bus prefetching
+ *
+ * ATA DMA and the original MPC5200 need this due to silicon bugs.  At the
+ * moment disabling prefetch is a one-way street.  There is no mechanism
+ * in place to turn prefetch back on after it has been disabled.  There is
+ * no reason it couldn't be done, it would just be more complex to implement.
+ */
+static inline void bcom_disable_prefetch(void)
+{
+       u16 regval;
+
+       regval = in_be16(&bcom_eng->regs->PtdCntrl);
+       out_be16(&bcom_eng->regs->PtdCntrl, regval | 1);
+};
+
+static inline void
+bcom_enable_task(int task)
+{
+        u16 reg;
+        reg = in_be16(&bcom_eng->regs->tcr[task]);
+        out_be16(&bcom_eng->regs->tcr[task],  reg | TASK_ENABLE);
+}
+
+static inline void
+bcom_disable_task(int task)
+{
+        u16 reg = in_be16(&bcom_eng->regs->tcr[task]);
+        out_be16(&bcom_eng->regs->tcr[task], reg & ~TASK_ENABLE);
+}
+
+
+static inline u32 *
+bcom_task_desc(int task)
+{
+       return bcom_sram_pa2va(bcom_eng->tdt[task].start);
+}
+
+static inline int
+bcom_task_num_descs(int task)
+{
+       return (bcom_eng->tdt[task].stop - bcom_eng->tdt[task].start)/sizeof(u32) + 1;
+}
+
+static inline u32 *
+bcom_task_var(int task)
+{
+       return bcom_sram_pa2va(bcom_eng->tdt[task].var);
+}
+
+static inline u32 *
+bcom_task_inc(int task)
+{
+       return &bcom_task_var(task)[BCOM_MAX_VAR];
+}
+
+
+static inline int
+bcom_drd_is_extended(u32 desc)
+{
+       return (desc) & BCOM_DRD_EXTENDED;
+}
+
+static inline int
+bcom_desc_is_drd(u32 desc)
+{
+       return !(desc & BCOM_LCD_MASK) && desc != BCOM_DESC_NOP;
+}
+
+static inline int
+bcom_desc_initiator(u32 desc)
+{
+       return (desc >> BCOM_DRD_INITIATOR_SHIFT) & 0x1f;
+}
+
+static inline void
+bcom_set_desc_initiator(u32 *desc, int initiator)
+{
+       *desc = (*desc & ~(0x1f << BCOM_DRD_INITIATOR_SHIFT)) |
+                       ((initiator & 0x1f) << BCOM_DRD_INITIATOR_SHIFT);
+}
+
+
+static inline void
+bcom_set_task_pragma(int task, int pragma)
+{
+       u32 *fdt = &bcom_eng->tdt[task].fdt;
+       *fdt = (*fdt & ~0xff) | pragma;
+}
+
+static inline void
+bcom_set_task_auto_start(int task, int next_task)
+{
+       u16 __iomem *tcr = &bcom_eng->regs->tcr[task];
+       out_be16(tcr, (in_be16(tcr) & ~0xff) | 0x00c0 | next_task);
+}
+
+static inline void
+bcom_set_tcr_initiator(int task, int initiator)
+{
+       u16 __iomem *tcr = &bcom_eng->regs->tcr[task];
+       out_be16(tcr, (in_be16(tcr) & ~0x1f00) | ((initiator & 0x1f) << 8));
+}
+
+
+#endif /* __BESTCOMM_PRIV_H__ */
+
diff --git a/include/linux/fsl/bestcomm/fec.h b/include/linux/fsl/bestcomm/fec.h
new file mode 100644 (file)
index 0000000..ee565d9
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Header for Bestcomm FEC tasks driver
+ *
+ *
+ * Copyright (C) 2006-2007 Sylvain Munaut <tnt@246tNt.com>
+ * Copyright (C) 2003-2004 MontaVista, Software, Inc.
+ *                         ( by Dale Farnsworth <dfarnsworth@mvista.com> )
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+#ifndef __BESTCOMM_FEC_H__
+#define __BESTCOMM_FEC_H__
+
+
+struct bcom_fec_bd {
+       u32     status;
+       u32     skb_pa;
+};
+
+#define BCOM_FEC_TX_BD_TFD     0x08000000ul    /* transmit frame done */
+#define BCOM_FEC_TX_BD_TC      0x04000000ul    /* transmit CRC */
+#define BCOM_FEC_TX_BD_ABC     0x02000000ul    /* append bad CRC */
+
+#define BCOM_FEC_RX_BD_L       0x08000000ul    /* buffer is last in frame */
+#define BCOM_FEC_RX_BD_BC      0x00800000ul    /* DA is broadcast */
+#define BCOM_FEC_RX_BD_MC      0x00400000ul    /* DA is multicast and not broadcast */
+#define BCOM_FEC_RX_BD_LG      0x00200000ul    /* Rx frame length violation */
+#define BCOM_FEC_RX_BD_NO      0x00100000ul    /* Rx non-octet aligned frame */
+#define BCOM_FEC_RX_BD_CR      0x00040000ul    /* Rx CRC error */
+#define BCOM_FEC_RX_BD_OV      0x00020000ul    /* overrun */
+#define BCOM_FEC_RX_BD_TR      0x00010000ul    /* Rx frame truncated */
+#define BCOM_FEC_RX_BD_LEN_MASK        0x000007fful    /* mask for length of received frame */
+#define BCOM_FEC_RX_BD_ERRORS  (BCOM_FEC_RX_BD_LG | BCOM_FEC_RX_BD_NO | \
+               BCOM_FEC_RX_BD_CR | BCOM_FEC_RX_BD_OV | BCOM_FEC_RX_BD_TR)
+
+
+extern struct bcom_task *
+bcom_fec_rx_init(int queue_len, phys_addr_t fifo, int maxbufsize);
+
+extern int
+bcom_fec_rx_reset(struct bcom_task *tsk);
+
+extern void
+bcom_fec_rx_release(struct bcom_task *tsk);
+
+
+extern struct bcom_task *
+bcom_fec_tx_init(int queue_len, phys_addr_t fifo);
+
+extern int
+bcom_fec_tx_reset(struct bcom_task *tsk);
+
+extern void
+bcom_fec_tx_release(struct bcom_task *tsk);
+
+
+#endif /* __BESTCOMM_FEC_H__ */
+
diff --git a/include/linux/fsl/bestcomm/gen_bd.h b/include/linux/fsl/bestcomm/gen_bd.h
new file mode 100644 (file)
index 0000000..de47260
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Header for Bestcomm General Buffer Descriptor tasks driver
+ *
+ *
+ * Copyright (C) 2007 Sylvain Munaut <tnt@246tNt.com>
+ * Copyright (C) 2006 AppSpec Computer Technologies Corp.
+ *                    Jeff Gibbons <jeff.gibbons@appspec.com>
+ *
+ * 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.
+ *
+ *
+ */
+
+#ifndef __BESTCOMM_GEN_BD_H__
+#define __BESTCOMM_GEN_BD_H__
+
+struct bcom_gen_bd {
+       u32     status;
+       u32     buf_pa;
+};
+
+
+extern struct bcom_task *
+bcom_gen_bd_rx_init(int queue_len, phys_addr_t fifo,
+                       int initiator, int ipr, int maxbufsize);
+
+extern int
+bcom_gen_bd_rx_reset(struct bcom_task *tsk);
+
+extern void
+bcom_gen_bd_rx_release(struct bcom_task *tsk);
+
+
+extern struct bcom_task *
+bcom_gen_bd_tx_init(int queue_len, phys_addr_t fifo,
+                       int initiator, int ipr);
+
+extern int
+bcom_gen_bd_tx_reset(struct bcom_task *tsk);
+
+extern void
+bcom_gen_bd_tx_release(struct bcom_task *tsk);
+
+
+/* PSC support utility wrappers */
+struct bcom_task * bcom_psc_gen_bd_rx_init(unsigned psc_num, int queue_len,
+                                          phys_addr_t fifo, int maxbufsize);
+struct bcom_task * bcom_psc_gen_bd_tx_init(unsigned psc_num, int queue_len,
+                                          phys_addr_t fifo);
+#endif  /* __BESTCOMM_GEN_BD_H__ */
+
diff --git a/include/linux/fsl/bestcomm/sram.h b/include/linux/fsl/bestcomm/sram.h
new file mode 100644 (file)
index 0000000..b6d6689
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Handling of a sram zone for bestcomm
+ *
+ *
+ * Copyright (C) 2007 Sylvain Munaut <tnt@246tNt.com>
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+#ifndef __BESTCOMM_SRAM_H__
+#define __BESTCOMM_SRAM_H__
+
+#include <asm/rheap.h>
+#include <asm/mmu.h>
+#include <linux/spinlock.h>
+
+
+/* Structure used internally */
+       /* The internals are here for the inline functions
+        * sake, certainly not for the user to mess with !
+        */
+struct bcom_sram {
+       phys_addr_t              base_phys;
+       void                    *base_virt;
+       unsigned int             size;
+       rh_info_t               *rh;
+       spinlock_t               lock;
+};
+
+extern struct bcom_sram *bcom_sram;
+
+
+/* Public API */
+extern int  bcom_sram_init(struct device_node *sram_node, char *owner);
+extern void bcom_sram_cleanup(void);
+
+extern void* bcom_sram_alloc(int size, int align, phys_addr_t *phys);
+extern void  bcom_sram_free(void *ptr);
+
+static inline phys_addr_t bcom_sram_va2pa(void *va) {
+       return bcom_sram->base_phys +
+               (unsigned long)(va - bcom_sram->base_virt);
+}
+
+static inline void *bcom_sram_pa2va(phys_addr_t pa) {
+       return bcom_sram->base_virt +
+               (unsigned long)(pa - bcom_sram->base_phys);
+}
+
+
+#endif  /* __BESTCOMM_SRAM_H__ */
+
index 9997c039bb245a7b891bbade0b436346fb5c5d3f..2a847ca494b5b4dfe00019d1b10c5ae8eccc817b 100644 (file)
@@ -14,8 +14,8 @@
 
 #include <sound/soc.h>
 
-#include <sysdev/bestcomm/bestcomm.h>
-#include <sysdev/bestcomm/gen_bd.h>
+#include <linux/fsl/bestcomm/bestcomm.h>
+#include <linux/fsl/bestcomm/gen_bd.h>
 #include <asm/mpc52xx_psc.h>
 
 #include "mpc5200_dma.h"