]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge branch 'for-2.6.25' of master.kernel.org:/pub/scm/linux/kernel/git/arnd/cell...
authorPaul Mackerras <paulus@samba.org>
Mon, 3 Mar 2008 10:31:09 +0000 (21:31 +1100)
committerPaul Mackerras <paulus@samba.org>
Mon, 3 Mar 2008 10:31:09 +0000 (21:31 +1100)
18 files changed:
arch/powerpc/boot/cuboot-bamboo.c
arch/powerpc/boot/cuboot-ebony.c
arch/powerpc/boot/cuboot-katmai.c
arch/powerpc/boot/cuboot-taishan.c
arch/powerpc/boot/cuboot-warp.c
arch/powerpc/boot/dts/haleakala.dts
arch/powerpc/boot/dts/katmai.dts
arch/powerpc/platforms/52xx/mpc52xx_common.c
arch/powerpc/platforms/cell/spu_base.c
arch/powerpc/platforms/cell/spufs/context.c
arch/powerpc/platforms/cell/spufs/file.c
arch/powerpc/platforms/cell/spufs/sched.c
arch/powerpc/platforms/cell/spufs/sputrace.c
arch/powerpc/platforms/cell/spufs/switch.c
drivers/char/xilinx_hwicap/buffer_icap.c
drivers/char/xilinx_hwicap/fifo_icap.c
drivers/char/xilinx_hwicap/xilinx_hwicap.c
drivers/char/xilinx_hwicap/xilinx_hwicap.h

index 900c7ff2b7e985d4aa679fccb1fa230a480cbf29..b5c30f766c401fa0828e61fd10d0c0c8b48a6e80 100644 (file)
@@ -17,6 +17,7 @@
 #include "44x.h"
 #include "cuboot.h"
 
+#define TARGET_4xx
 #define TARGET_44x
 #include "ppcboot.h"
 
index c5f37ce172ea92654a7509c72680de4bf55c26ef..56564ba37f62d1d7a7aba46ff94362627c8f8f69 100644 (file)
@@ -17,6 +17,7 @@
 #include "44x.h"
 #include "cuboot.h"
 
+#define TARGET_4xx
 #define TARGET_44x
 #include "ppcboot.h"
 
index c021167f938122078f3c4081f626c8482099df07..5434d70b56605670e041834d326ab9cb72a561f5 100644 (file)
@@ -22,6 +22,7 @@
 #include "44x.h"
 #include "cuboot.h"
 
+#define TARGET_4xx
 #define TARGET_44x
 #include "ppcboot.h"
 
index f66455a45ab1cfcbf17f5bfbd391f0fb3e37cd37..b55b80467eed9b23e70d7347e134745723116af1 100644 (file)
@@ -21,7 +21,9 @@
 #include "dcr.h"
 #include "4xx.h"
 
+#define TARGET_4xx
 #define TARGET_44x
+#define TARGET_440GX
 #include "ppcboot.h"
 
 static bd_t bd;
index bdedebe1bc1434180527101c5085f386d9b12dc4..3db93e85e9eaa65cc954bfdf0384d3e273b761f0 100644 (file)
@@ -11,6 +11,7 @@
 #include "4xx.h"
 #include "cuboot.h"
 
+#define TARGET_4xx
 #define TARGET_44x
 #include "ppcboot.h"
 
index 5dd3d15f0febabfaf212ad2b4fd5ad8433e53171..ae68fefc01b6a054b62eaaaffde5930e983e72dc 100644 (file)
                        #interrupt-cells = <1>;
                        #size-cells = <2>;
                        #address-cells = <3>;
-                       compatible = "ibm,plb-pciex-405exr", "ibm,plb-pciex";
+                       compatible = "ibm,plb-pciex-405ex", "ibm,plb-pciex";
                        primary;
                        port = <0>; /* port number */
                        reg = <a0000000 20000000        /* Config space access */
index bc32ac7250ec5448b4aacc09aec1d78b911e4be0..fc86e5a3afc47ebd16be1b2fc7115721d6d2f79e 100644 (file)
@@ -38,8 +38,8 @@
                        timebase-frequency = <0>; /* Filled in by zImage */
                        i-cache-line-size = <20>;
                        d-cache-line-size = <20>;
-                       i-cache-size = <20000>;
-                       d-cache-size = <20000>;
+                       i-cache-size = <8000>;
+                       d-cache-size = <8000>;
                        dcr-controller;
                        dcr-access-method = "native";
                };
                };
 
                POB0: opb {
-                       compatible = "ibm,opb-440spe", "ibm,opb-440gp", "ibm,opb";
+                       compatible = "ibm,opb-440spe", "ibm,opb-440gp", "ibm,opb";
                        #address-cells = <1>;
                        #size-cells = <1>;
-                       ranges = <00000000 4 e0000000 20000000>;
-                       clock-frequency = <0>; /* Filled in by zImage */
+                       ranges = <00000000 4 e0000000 20000000>;
+                       clock-frequency = <0>; /* Filled in by zImage */
 
                        EBC0: ebc {
                                compatible = "ibm,ebc-440spe", "ibm,ebc-440gp", "ibm,ebc";
                        };
 
                        UART0: serial@10000200 {
-                               device_type = "serial";
-                               compatible = "ns16550";
-                               reg = <10000200 8>;
+                               device_type = "serial";
+                               compatible = "ns16550";
+                               reg = <10000200 8>;
                                virtual-reg = <a0000200>;
-                               clock-frequency = <0>; /* Filled in by zImage */
-                               current-speed = <1c200>;
-                               interrupt-parent = <&UIC0>;
-                               interrupts = <0 4>;
-                       };
+                               clock-frequency = <0>; /* Filled in by zImage */
+                               current-speed = <1c200>;
+                               interrupt-parent = <&UIC0>;
+                               interrupts = <0 4>;
+                       };
 
                        UART1: serial@10000300 {
-                               device_type = "serial";
-                               compatible = "ns16550";
-                               reg = <10000300 8>;
+                               device_type = "serial";
+                               compatible = "ns16550";
+                               reg = <10000300 8>;
                                virtual-reg = <a0000300>;
-                               clock-frequency = <0>;
-                               current-speed = <0>;
-                               interrupt-parent = <&UIC0>;
-                               interrupts = <1 4>;
-                       };
+                               clock-frequency = <0>;
+                               current-speed = <0>;
+                               interrupt-parent = <&UIC0>;
+                               interrupts = <1 4>;
+                       };
 
 
                        UART2: serial@10000600 {
-                               device_type = "serial";
-                               compatible = "ns16550";
-                               reg = <10000600 8>;
+                               device_type = "serial";
+                               compatible = "ns16550";
+                               reg = <10000600 8>;
                                virtual-reg = <a0000600>;
-                               clock-frequency = <0>;
-                               current-speed = <0>;
-                               interrupt-parent = <&UIC1>;
-                               interrupts = <5 4>;
-                       };
+                               clock-frequency = <0>;
+                               current-speed = <0>;
+                               interrupt-parent = <&UIC1>;
+                               interrupts = <5 4>;
+                       };
 
                        IIC0: i2c@10000400 {
                                compatible = "ibm,iic-440spe", "ibm,iic-440gp", "ibm,iic";
index 9aa4425d80b20a4d1fe77eb36ca2eded77095bb0..4d5fd1dbd4007a5235b5b170367e451cc4f40b67 100644 (file)
@@ -199,6 +199,7 @@ int mpc52xx_set_psc_clkdiv(int psc_id, int clkdiv)
 
        return 0;
 }
+EXPORT_SYMBOL(mpc52xx_set_psc_clkdiv);
 
 /**
  * mpc52xx_restart: ppc_md->restart hook for mpc5200 using the watchdog timer
index 87eb07f94c5f111e345cdebe47640bb1d4a6a1ea..712001f6b7dad366cd1b2ab78107811cf6f485fb 100644 (file)
@@ -81,9 +81,12 @@ struct spu_slb {
 void spu_invalidate_slbs(struct spu *spu)
 {
        struct spu_priv2 __iomem *priv2 = spu->priv2;
+       unsigned long flags;
 
+       spin_lock_irqsave(&spu->register_lock, flags);
        if (spu_mfc_sr1_get(spu) & MFC_STATE1_RELOCATE_MASK)
                out_be64(&priv2->slb_invalidate_all_W, 0UL);
+       spin_unlock_irqrestore(&spu->register_lock, flags);
 }
 EXPORT_SYMBOL_GPL(spu_invalidate_slbs);
 
@@ -148,7 +151,11 @@ static inline void spu_load_slb(struct spu *spu, int slbe, struct spu_slb *slb)
                        __func__, slbe, slb->vsid, slb->esid);
 
        out_be64(&priv2->slb_index_W, slbe);
+       /* set invalid before writing vsid */
+       out_be64(&priv2->slb_esid_RW, 0);
+       /* now it's safe to write the vsid */
        out_be64(&priv2->slb_vsid_RW, slb->vsid);
+       /* setting the new esid makes the entry valid again */
        out_be64(&priv2->slb_esid_RW, slb->esid);
 }
 
@@ -290,9 +297,11 @@ void spu_setup_kernel_slbs(struct spu *spu, struct spu_lscsa *lscsa,
                nr_slbs++;
        }
 
+       spin_lock_irq(&spu->register_lock);
        /* Add the set of SLBs */
        for (i = 0; i < nr_slbs; i++)
                spu_load_slb(spu, i, &slbs[i]);
+       spin_unlock_irq(&spu->register_lock);
 }
 EXPORT_SYMBOL_GPL(spu_setup_kernel_slbs);
 
@@ -337,13 +346,14 @@ spu_irq_class_1(int irq, void *data)
        if (stat & CLASS1_STORAGE_FAULT_INTR)
                spu_mfc_dsisr_set(spu, 0ul);
        spu_int_stat_clear(spu, 1, stat);
-       spin_unlock(&spu->register_lock);
-       pr_debug("%s: %lx %lx %lx %lx\n", __FUNCTION__, mask, stat,
-                       dar, dsisr);
 
        if (stat & CLASS1_SEGMENT_FAULT_INTR)
                __spu_trap_data_seg(spu, dar);
 
+       spin_unlock(&spu->register_lock);
+       pr_debug("%s: %lx %lx %lx %lx\n", __FUNCTION__, mask, stat,
+                       dar, dsisr);
+
        if (stat & CLASS1_STORAGE_FAULT_INTR)
                __spu_trap_data_map(spu, dar, dsisr);
 
index 133995ed5cc78c104745534915ec3331f6601ed6..cf6c2c89211d2dc2fe308e50404370d3ae9af418 100644 (file)
@@ -109,13 +109,12 @@ void spu_forget(struct spu_context *ctx)
 
        /*
         * This is basically an open-coded spu_acquire_saved, except that
-        * we don't acquire the state mutex interruptible.
+        * we don't acquire the state mutex interruptible, and we don't
+        * want this context to be rescheduled on release.
         */
        mutex_lock(&ctx->state_mutex);
-       if (ctx->state != SPU_STATE_SAVED) {
-               set_bit(SPU_SCHED_WAS_ACTIVE, &ctx->sched_flags);
+       if (ctx->state != SPU_STATE_SAVED)
                spu_deactivate(ctx);
-       }
 
        mm = ctx->owner;
        ctx->owner = NULL;
index c66c3756970d53d52ae56df931e38219a9e79ade..f7a7e8635fb6f98d11ab8aa5bf5cf3d2d6f49bf8 100644 (file)
@@ -366,6 +366,13 @@ static unsigned long spufs_ps_nopfn(struct vm_area_struct *vma,
        if (offset >= ps_size)
                return NOPFN_SIGBUS;
 
+       /*
+        * Because we release the mmap_sem, the context may be destroyed while
+        * we're in spu_wait. Grab an extra reference so it isn't destroyed
+        * in the meantime.
+        */
+       get_spu_context(ctx);
+
        /*
         * We have to wait for context to be loaded before we have
         * pages to hand out to the user, but we don't want to wait
@@ -375,7 +382,7 @@ static unsigned long spufs_ps_nopfn(struct vm_area_struct *vma,
         * hanged.
         */
        if (spu_acquire(ctx))
-               return NOPFN_REFAULT;
+               goto refault;
 
        if (ctx->state == SPU_STATE_SAVED) {
                up_read(&current->mm->mmap_sem);
@@ -391,6 +398,9 @@ static unsigned long spufs_ps_nopfn(struct vm_area_struct *vma,
 
        if (!ret)
                spu_release(ctx);
+
+refault:
+       put_spu_context(ctx);
        return NOPFN_REFAULT;
 }
 
index 3a5972117de7cdcd04504ae46d97e8b79376e0bc..5d5f680cd0b8ced5789556e444a0b8b955cc23c8 100644 (file)
@@ -246,7 +246,7 @@ static void spu_bind_context(struct spu *spu, struct spu_context *ctx)
        spu_switch_notify(spu, ctx);
        ctx->state = SPU_STATE_RUNNABLE;
 
-       spuctx_switch_state(ctx, SPU_UTIL_IDLE_LOADED);
+       spuctx_switch_state(ctx, SPU_UTIL_USER);
 }
 
 /*
index 01974f7776e184d798d33cb2728dc5c610cad368..79aa773f3c992abff92f38f51608bdcc5497c0a1 100644 (file)
@@ -58,12 +58,12 @@ static int sputrace_sprint(char *tbuf, int n)
                ktime_to_timespec(ktime_sub(t->tstamp, sputrace_start));
 
        return snprintf(tbuf, n,
-               "[%lu.%09lu] %d: %s (thread = %d, spu = %d)\n",
+               "[%lu.%09lu] %d: %s (ctxthread = %d, spu = %d)\n",
                (unsigned long) tv.tv_sec,
                (unsigned long) tv.tv_nsec,
-               t->owner_tid,
-               t->name,
                t->curr_tid,
+               t->name,
+               t->owner_tid,
                t->number);
 }
 
@@ -188,6 +188,7 @@ struct spu_probe spu_probes[] = {
        { "spufs_ps_nopfn__insert", "%p %p", spu_context_event },
        { "spu_acquire_saved__enter", "%p", spu_context_nospu_event },
        { "destroy_spu_context__enter", "%p", spu_context_nospu_event },
+       { "spufs_stop_callback__enter", "%p %p", spu_context_event },
 };
 
 static int __init sputrace_init(void)
index 6f5886c7b1f9a8e5f16c1220df0a53c9c60cf241..e9dc7a55d1b9466d5f5e5597371a79789b46ed30 100644 (file)
@@ -34,6 +34,7 @@
 
 #include <linux/module.h>
 #include <linux/errno.h>
+#include <linux/hardirq.h>
 #include <linux/sched.h>
 #include <linux/kernel.h>
 #include <linux/mm.h>
@@ -117,6 +118,8 @@ static inline void disable_interrupts(struct spu_state *csa, struct spu *spu)
         *     Write INT_MASK_class1 with value of 0.
         *     Save INT_Mask_class2 in CSA.
         *     Write INT_MASK_class2 with value of 0.
+        *     Synchronize all three interrupts to be sure
+        *     we no longer execute a handler on another CPU.
         */
        spin_lock_irq(&spu->register_lock);
        if (csa) {
@@ -129,6 +132,9 @@ static inline void disable_interrupts(struct spu_state *csa, struct spu *spu)
        spu_int_mask_set(spu, 2, 0ul);
        eieio();
        spin_unlock_irq(&spu->register_lock);
+       synchronize_irq(spu->irqs[0]);
+       synchronize_irq(spu->irqs[1]);
+       synchronize_irq(spu->irqs[2]);
 }
 
 static inline void set_watchdog_timer(struct spu_state *csa, struct spu *spu)
index dfea2bde162b8c43349681e01580834cfe084983..f577daedb630d1babb74c8e7c9e9e3d5458d052c 100644 (file)
@@ -73,8 +73,8 @@
 #define XHI_BUFFER_START 0
 
 /**
- * buffer_icap_get_status: Get the contents of the status register.
- * @parameter base_address: is the base address of the device
+ * buffer_icap_get_status - Get the contents of the status register.
+ * @base_address: is the base address of the device
  *
  * The status register contains the ICAP status and the done bit.
  *
@@ -94,9 +94,9 @@ static inline u32 buffer_icap_get_status(void __iomem *base_address)
 }
 
 /**
- * buffer_icap_get_bram: Reads data from the storage buffer bram.
- * @parameter base_address: contains the base address of the component.
- * @parameter offset: The word offset from which the data should be read.
+ * buffer_icap_get_bram - Reads data from the storage buffer bram.
+ * @base_address: contains the base address of the component.
+ * @offset: The word offset from which the data should be read.
  *
  * A bram is used as a configuration memory cache.  One frame of data can
  * be stored in this "storage buffer".
@@ -108,8 +108,8 @@ static inline u32 buffer_icap_get_bram(void __iomem *base_address,
 }
 
 /**
- * buffer_icap_busy: Return true if the icap device is busy
- * @parameter base_address: is the base address of the device
+ * buffer_icap_busy - Return true if the icap device is busy
+ * @base_address: is the base address of the device
  *
  * The queries the low order bit of the status register, which
  * indicates whether the current configuration or readback operation
@@ -121,8 +121,8 @@ static inline bool buffer_icap_busy(void __iomem *base_address)
 }
 
 /**
- * buffer_icap_busy: Return true if the icap device is not busy
- * @parameter base_address: is the base address of the device
+ * buffer_icap_busy - Return true if the icap device is not busy
+ * @base_address: is the base address of the device
  *
  * The queries the low order bit of the status register, which
  * indicates whether the current configuration or readback operation
@@ -134,9 +134,9 @@ static inline bool buffer_icap_done(void __iomem *base_address)
 }
 
 /**
- * buffer_icap_set_size: Set the size register.
- * @parameter base_address: is the base address of the device
- * @parameter data: The size in bytes.
+ * buffer_icap_set_size - Set the size register.
+ * @base_address: is the base address of the device
+ * @data: The size in bytes.
  *
  * The size register holds the number of 8 bit bytes to transfer between
  * bram and the icap (or icap to bram).
@@ -148,9 +148,9 @@ static inline void buffer_icap_set_size(void __iomem *base_address,
 }
 
 /**
- * buffer_icap_mSetoffsetReg: Set the bram offset register.
- * @parameter base_address: contains the base address of the device.
- * @parameter data: is the value to be written to the data register.
+ * buffer_icap_set_offset - Set the bram offset register.
+ * @base_address: contains the base address of the device.
+ * @data: is the value to be written to the data register.
  *
  * The bram offset register holds the starting bram address to transfer
  * data from during configuration or write data to during readback.
@@ -162,9 +162,9 @@ static inline void buffer_icap_set_offset(void __iomem *base_address,
 }
 
 /**
- * buffer_icap_set_rnc: Set the RNC (Readback not Configure) register.
- * @parameter base_address: contains the base address of the device.
- * @parameter data: is the value to be written to the data register.
+ * buffer_icap_set_rnc - Set the RNC (Readback not Configure) register.
+ * @base_address: contains the base address of the device.
+ * @data: is the value to be written to the data register.
  *
  * The RNC register determines the direction of the data transfer.  It
  * controls whether a configuration or readback take place.  Writing to
@@ -178,10 +178,10 @@ static inline void buffer_icap_set_rnc(void __iomem *base_address,
 }
 
 /**
- * buffer_icap_set_bram: Write data to the storage buffer bram.
- * @parameter base_address: contains the base address of the component.
- * @parameter offset: The word offset at which the data should be written.
- * @parameter data: The value to be written to the bram offset.
+ * buffer_icap_set_bram - Write data to the storage buffer bram.
+ * @base_address: contains the base address of the component.
+ * @offset: The word offset at which the data should be written.
+ * @data: The value to be written to the bram offset.
  *
  * A bram is used as a configuration memory cache.  One frame of data can
  * be stored in this "storage buffer".
@@ -193,10 +193,10 @@ static inline void buffer_icap_set_bram(void __iomem *base_address,
 }
 
 /**
- * buffer_icap_device_read: Transfer bytes from ICAP to the storage buffer.
- * @parameter drvdata: a pointer to the drvdata.
- * @parameter offset: The storage buffer start address.
- * @parameter count: The number of words (32 bit) to read from the
+ * buffer_icap_device_read - Transfer bytes from ICAP to the storage buffer.
+ * @drvdata: a pointer to the drvdata.
+ * @offset: The storage buffer start address.
+ * @count: The number of words (32 bit) to read from the
  *           device (ICAP).
  **/
 static int buffer_icap_device_read(struct hwicap_drvdata *drvdata,
@@ -227,10 +227,10 @@ static int buffer_icap_device_read(struct hwicap_drvdata *drvdata,
 };
 
 /**
- * buffer_icap_device_write: Transfer bytes from ICAP to the storage buffer.
- * @parameter drvdata: a pointer to the drvdata.
- * @parameter offset: The storage buffer start address.
- * @parameter count: The number of words (32 bit) to read from the
+ * buffer_icap_device_write - Transfer bytes from ICAP to the storage buffer.
+ * @drvdata: a pointer to the drvdata.
+ * @offset: The storage buffer start address.
+ * @count: The number of words (32 bit) to read from the
  *           device (ICAP).
  **/
 static int buffer_icap_device_write(struct hwicap_drvdata *drvdata,
@@ -261,8 +261,8 @@ static int buffer_icap_device_write(struct hwicap_drvdata *drvdata,
 };
 
 /**
- * buffer_icap_reset: Reset the logic of the icap device.
- * @parameter drvdata: a pointer to the drvdata.
+ * buffer_icap_reset - Reset the logic of the icap device.
+ * @drvdata: a pointer to the drvdata.
  *
  * Writing to the status register resets the ICAP logic in an internal
  * version of the core.  For the version of the core published in EDK,
@@ -274,10 +274,10 @@ void buffer_icap_reset(struct hwicap_drvdata *drvdata)
 }
 
 /**
- * buffer_icap_set_configuration: Load a partial bitstream from system memory.
- * @parameter drvdata: a pointer to the drvdata.
- * @parameter data: Kernel address of the partial bitstream.
- * @parameter size: the size of the partial bitstream in 32 bit words.
+ * buffer_icap_set_configuration - Load a partial bitstream from system memory.
+ * @drvdata: a pointer to the drvdata.
+ * @data: Kernel address of the partial bitstream.
+ * @size: the size of the partial bitstream in 32 bit words.
  **/
 int buffer_icap_set_configuration(struct hwicap_drvdata *drvdata, u32 *data,
                             u32 size)
@@ -333,10 +333,10 @@ int buffer_icap_set_configuration(struct hwicap_drvdata *drvdata, u32 *data,
 };
 
 /**
- * buffer_icap_get_configuration: Read configuration data from the device.
- * @parameter drvdata: a pointer to the drvdata.
- * @parameter data: Address of the data representing the partial bitstream
- * @parameter size: the size of the partial bitstream in 32 bit words.
+ * buffer_icap_get_configuration - Read configuration data from the device.
+ * @drvdata: a pointer to the drvdata.
+ * @data: Address of the data representing the partial bitstream
+ * @size: the size of the partial bitstream in 32 bit words.
  **/
 int buffer_icap_get_configuration(struct hwicap_drvdata *drvdata, u32 *data,
                             u32 size)
index 0988314694a6a59ce45aaca43986e203c3e20d1b..6f45dbd47125636a44af08d8b2dab33a70e3bf4c 100644 (file)
@@ -94,9 +94,9 @@
 
 
 /**
- * fifo_icap_fifo_write: Write data to the write FIFO.
- * @parameter drvdata: a pointer to the drvdata.
- * @parameter data: the 32-bit value to be written to the FIFO.
+ * fifo_icap_fifo_write - Write data to the write FIFO.
+ * @drvdata: a pointer to the drvdata.
+ * @data: the 32-bit value to be written to the FIFO.
  *
  * This function will silently fail if the fifo is full.
  **/
@@ -108,8 +108,8 @@ static inline void fifo_icap_fifo_write(struct hwicap_drvdata *drvdata,
 }
 
 /**
- * fifo_icap_fifo_read: Read data from the Read FIFO.
- * @parameter drvdata: a pointer to the drvdata.
+ * fifo_icap_fifo_read - Read data from the Read FIFO.
+ * @drvdata: a pointer to the drvdata.
  *
  * This function will silently fail if the fifo is empty.
  **/
@@ -121,9 +121,9 @@ static inline u32 fifo_icap_fifo_read(struct hwicap_drvdata *drvdata)
 }
 
 /**
- * fifo_icap_set_read_size: Set the the size register.
- * @parameter drvdata: a pointer to the drvdata.
- * @parameter data: the size of the following read transaction, in words.
+ * fifo_icap_set_read_size - Set the the size register.
+ * @drvdata: a pointer to the drvdata.
+ * @data: the size of the following read transaction, in words.
  **/
 static inline void fifo_icap_set_read_size(struct hwicap_drvdata *drvdata,
                u32 data)
@@ -132,8 +132,8 @@ static inline void fifo_icap_set_read_size(struct hwicap_drvdata *drvdata,
 }
 
 /**
- * fifo_icap_start_config: Initiate a configuration (write) to the device.
- * @parameter drvdata: a pointer to the drvdata.
+ * fifo_icap_start_config - Initiate a configuration (write) to the device.
+ * @drvdata: a pointer to the drvdata.
  **/
 static inline void fifo_icap_start_config(struct hwicap_drvdata *drvdata)
 {
@@ -142,8 +142,8 @@ static inline void fifo_icap_start_config(struct hwicap_drvdata *drvdata)
 }
 
 /**
- * fifo_icap_start_readback: Initiate a readback from the device.
- * @parameter drvdata: a pointer to the drvdata.
+ * fifo_icap_start_readback - Initiate a readback from the device.
+ * @drvdata: a pointer to the drvdata.
  **/
 static inline void fifo_icap_start_readback(struct hwicap_drvdata *drvdata)
 {
@@ -152,8 +152,8 @@ static inline void fifo_icap_start_readback(struct hwicap_drvdata *drvdata)
 }
 
 /**
- * fifo_icap_busy: Return true if the ICAP is still processing a transaction.
- * @parameter drvdata: a pointer to the drvdata.
+ * fifo_icap_busy - Return true if the ICAP is still processing a transaction.
+ * @drvdata: a pointer to the drvdata.
  **/
 static inline u32 fifo_icap_busy(struct hwicap_drvdata *drvdata)
 {
@@ -163,8 +163,8 @@ static inline u32 fifo_icap_busy(struct hwicap_drvdata *drvdata)
 }
 
 /**
- * fifo_icap_write_fifo_vacancy: Query the write fifo available space.
- * @parameter drvdata: a pointer to the drvdata.
+ * fifo_icap_write_fifo_vacancy - Query the write fifo available space.
+ * @drvdata: a pointer to the drvdata.
  *
  * Return the number of words that can be safely pushed into the write fifo.
  **/
@@ -175,8 +175,8 @@ static inline u32 fifo_icap_write_fifo_vacancy(
 }
 
 /**
- * fifo_icap_read_fifo_occupancy: Query the read fifo available data.
- * @parameter drvdata: a pointer to the drvdata.
+ * fifo_icap_read_fifo_occupancy - Query the read fifo available data.
+ * @drvdata: a pointer to the drvdata.
  *
  * Return the number of words that can be safely read from the read fifo.
  **/
@@ -187,11 +187,11 @@ static inline u32 fifo_icap_read_fifo_occupancy(
 }
 
 /**
- * fifo_icap_set_configuration: Send configuration data to the ICAP.
- * @parameter drvdata: a pointer to the drvdata.
- * @parameter frame_buffer: a pointer to the data to be written to the
+ * fifo_icap_set_configuration - Send configuration data to the ICAP.
+ * @drvdata: a pointer to the drvdata.
+ * @frame_buffer: a pointer to the data to be written to the
  *             ICAP device.
- * @parameter num_words: the number of words (32 bit) to write to the ICAP
+ * @num_words: the number of words (32 bit) to write to the ICAP
  *             device.
 
  * This function writes the given user data to the Write FIFO in
@@ -266,10 +266,10 @@ int fifo_icap_set_configuration(struct hwicap_drvdata *drvdata,
 }
 
 /**
- * fifo_icap_get_configuration: Read configuration data from the device.
- * @parameter drvdata: a pointer to the drvdata.
- * @parameter data: Address of the data representing the partial bitstream
- * @parameter size: the size of the partial bitstream in 32 bit words.
+ * fifo_icap_get_configuration - Read configuration data from the device.
+ * @drvdata: a pointer to the drvdata.
+ * @data: Address of the data representing the partial bitstream
+ * @size: the size of the partial bitstream in 32 bit words.
  *
  * This function reads the specified number of words from the ICAP device in
  * the polled mode.
@@ -335,8 +335,8 @@ int fifo_icap_get_configuration(struct hwicap_drvdata *drvdata,
 }
 
 /**
- * buffer_icap_reset: Reset the logic of the icap device.
- * @parameter drvdata: a pointer to the drvdata.
+ * buffer_icap_reset - Reset the logic of the icap device.
+ * @drvdata: a pointer to the drvdata.
  *
  * This function forces the software reset of the complete HWICAP device.
  * All the registers will return to the default value and the FIFO is also
@@ -360,8 +360,8 @@ void fifo_icap_reset(struct hwicap_drvdata *drvdata)
 }
 
 /**
- * fifo_icap_flush_fifo: This function flushes the FIFOs in the device.
- * @parameter drvdata: a pointer to the drvdata.
+ * fifo_icap_flush_fifo - This function flushes the FIFOs in the device.
+ * @drvdata: a pointer to the drvdata.
  */
 void fifo_icap_flush_fifo(struct hwicap_drvdata *drvdata)
 {
index 24f6aef0fd3ceb605a0e4ba6cbf4def597360084..2284fa2a5a5726c52c873e4f13caff36cfab5f3b 100644 (file)
@@ -84,7 +84,7 @@
 #include <linux/init.h>
 #include <linux/poll.h>
 #include <linux/proc_fs.h>
-#include <asm/semaphore.h>
+#include <linux/mutex.h>
 #include <linux/sysctl.h>
 #include <linux/version.h>
 #include <linux/fs.h>
@@ -119,6 +119,7 @@ module_param(xhwicap_minor, int, S_IRUGO);
 
 /* An array, which is set to true when the device is registered. */
 static bool probed_devices[HWICAP_DEVICES];
+static struct mutex icap_sem;
 
 static struct class *icap_class;
 
@@ -199,14 +200,14 @@ static const struct config_registers v5_config_registers = {
 };
 
 /**
- * hwicap_command_desync: Send a DESYNC command to the ICAP port.
- * @parameter drvdata: a pointer to the drvdata.
+ * hwicap_command_desync - Send a DESYNC command to the ICAP port.
+ * @drvdata: a pointer to the drvdata.
  *
  * This command desynchronizes the ICAP After this command, a
  * bitstream containing a NULL packet, followed by a SYNCH packet is
  * required before the ICAP will recognize commands.
  */
-int hwicap_command_desync(struct hwicap_drvdata *drvdata)
+static int hwicap_command_desync(struct hwicap_drvdata *drvdata)
 {
        u32 buffer[4];
        u32 index = 0;
@@ -228,51 +229,18 @@ int hwicap_command_desync(struct hwicap_drvdata *drvdata)
 }
 
 /**
- * hwicap_command_capture: Send a CAPTURE command to the ICAP port.
- * @parameter drvdata: a pointer to the drvdata.
- *
- * This command captures all of the flip flop states so they will be
- * available during readback.  One can use this command instead of
- * enabling the CAPTURE block in the design.
- */
-int hwicap_command_capture(struct hwicap_drvdata *drvdata)
-{
-       u32 buffer[7];
-       u32 index = 0;
-
-       /*
-        * Create the data to be written to the ICAP.
-        */
-       buffer[index++] = XHI_DUMMY_PACKET;
-       buffer[index++] = XHI_SYNC_PACKET;
-       buffer[index++] = XHI_NOOP_PACKET;
-       buffer[index++] = hwicap_type_1_write(drvdata->config_regs->CMD) | 1;
-       buffer[index++] = XHI_CMD_GCAPTURE;
-       buffer[index++] = XHI_DUMMY_PACKET;
-       buffer[index++] = XHI_DUMMY_PACKET;
-
-       /*
-        * Write the data to the FIFO and intiate the transfer of data
-        * present in the FIFO to the ICAP device.
-        */
-       return drvdata->config->set_configuration(drvdata,
-                       &buffer[0], index);
-
-}
-
-/**
- * hwicap_get_configuration_register: Query a configuration register.
- * @parameter drvdata: a pointer to the drvdata.
- * @parameter reg: a constant which represents the configuration
+ * hwicap_get_configuration_register - Query a configuration register.
+ * @drvdata: a pointer to the drvdata.
+ * @reg: a constant which represents the configuration
  *             register value to be returned.
  *             Examples:  XHI_IDCODE, XHI_FLR.
- * @parameter RegData: returns the value of the register.
+ * @reg_data: returns the value of the register.
  *
  * Sends a query packet to the ICAP and then receives the response.
  * The icap is left in Synched state.
  */
-int hwicap_get_configuration_register(struct hwicap_drvdata *drvdata,
-               u32 reg, u32 *RegData)
+static int hwicap_get_configuration_register(struct hwicap_drvdata *drvdata,
+               u32 reg, u32 *reg_data)
 {
        int status;
        u32 buffer[6];
@@ -300,14 +268,14 @@ int hwicap_get_configuration_register(struct hwicap_drvdata *drvdata,
        /*
         * Read the configuration register
         */
-       status = drvdata->config->get_configuration(drvdata, RegData, 1);
+       status = drvdata->config->get_configuration(drvdata, reg_data, 1);
        if (status)
                return status;
 
        return 0;
 }
 
-int hwicap_initialize_hwicap(struct hwicap_drvdata *drvdata)
+static int hwicap_initialize_hwicap(struct hwicap_drvdata *drvdata)
 {
        int status;
        u32 idcode;
@@ -344,7 +312,7 @@ int hwicap_initialize_hwicap(struct hwicap_drvdata *drvdata)
 }
 
 static ssize_t
-hwicap_read(struct file *file, char *buf, size_t count, loff_t *ppos)
+hwicap_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
 {
        struct hwicap_drvdata *drvdata = file->private_data;
        ssize_t bytes_to_read = 0;
@@ -353,8 +321,9 @@ hwicap_read(struct file *file, char *buf, size_t count, loff_t *ppos)
        u32 bytes_remaining;
        int status;
 
-       if (down_interruptible(&drvdata->sem))
-               return -ERESTARTSYS;
+       status = mutex_lock_interruptible(&drvdata->sem);
+       if (status)
+               return status;
 
        if (drvdata->read_buffer_in_use) {
                /* If there are leftover bytes in the buffer, just */
@@ -370,8 +339,9 @@ hwicap_read(struct file *file, char *buf, size_t count, loff_t *ppos)
                        goto error;
                }
                drvdata->read_buffer_in_use -= bytes_to_read;
-               memcpy(drvdata->read_buffer + bytes_to_read,
-                               drvdata->read_buffer, 4 - bytes_to_read);
+               memmove(drvdata->read_buffer,
+                      drvdata->read_buffer + bytes_to_read,
+                      4 - bytes_to_read);
        } else {
                /* Get new data from the ICAP, and return was was requested. */
                kbuf = (u32 *) get_zeroed_page(GFP_KERNEL);
@@ -414,18 +384,20 @@ hwicap_read(struct file *file, char *buf, size_t count, loff_t *ppos)
                        status = -EFAULT;
                        goto error;
                }
-               memcpy(kbuf, drvdata->read_buffer, bytes_remaining);
+               memcpy(drvdata->read_buffer,
+                      kbuf,
+                      bytes_remaining);
                drvdata->read_buffer_in_use = bytes_remaining;
                free_page((unsigned long)kbuf);
        }
        status = bytes_to_read;
  error:
-       up(&drvdata->sem);
+       mutex_unlock(&drvdata->sem);
        return status;
 }
 
 static ssize_t
-hwicap_write(struct file *file, const char *buf,
+hwicap_write(struct file *file, const char __user *buf,
                size_t count, loff_t *ppos)
 {
        struct hwicap_drvdata *drvdata = file->private_data;
@@ -435,8 +407,9 @@ hwicap_write(struct file *file, const char *buf,
        ssize_t len;
        ssize_t status;
 
-       if (down_interruptible(&drvdata->sem))
-               return -ERESTARTSYS;
+       status = mutex_lock_interruptible(&drvdata->sem);
+       if (status)
+               return status;
 
        left += drvdata->write_buffer_in_use;
 
@@ -465,7 +438,7 @@ hwicap_write(struct file *file, const char *buf,
                        memcpy(kbuf, drvdata->write_buffer,
                                        drvdata->write_buffer_in_use);
                        if (copy_from_user(
-                           (((char *)kbuf) + (drvdata->write_buffer_in_use)),
+                           (((char *)kbuf) + drvdata->write_buffer_in_use),
                            buf + written,
                            len - (drvdata->write_buffer_in_use))) {
                                free_page((unsigned long)kbuf);
@@ -508,7 +481,7 @@ hwicap_write(struct file *file, const char *buf,
        free_page((unsigned long)kbuf);
        status = written;
  error:
-       up(&drvdata->sem);
+       mutex_unlock(&drvdata->sem);
        return status;
 }
 
@@ -519,8 +492,9 @@ static int hwicap_open(struct inode *inode, struct file *file)
 
        drvdata = container_of(inode->i_cdev, struct hwicap_drvdata, cdev);
 
-       if (down_interruptible(&drvdata->sem))
-               return -ERESTARTSYS;
+       status = mutex_lock_interruptible(&drvdata->sem);
+       if (status)
+               return status;
 
        if (drvdata->is_open) {
                status = -EBUSY;
@@ -539,7 +513,7 @@ static int hwicap_open(struct inode *inode, struct file *file)
        drvdata->is_open = 1;
 
  error:
-       up(&drvdata->sem);
+       mutex_unlock(&drvdata->sem);
        return status;
 }
 
@@ -549,8 +523,7 @@ static int hwicap_release(struct inode *inode, struct file *file)
        int i;
        int status = 0;
 
-       if (down_interruptible(&drvdata->sem))
-               return -ERESTARTSYS;
+       mutex_lock(&drvdata->sem);
 
        if (drvdata->write_buffer_in_use) {
                /* Flush write buffer. */
@@ -569,7 +542,7 @@ static int hwicap_release(struct inode *inode, struct file *file)
 
  error:
        drvdata->is_open = 0;
-       up(&drvdata->sem);
+       mutex_unlock(&drvdata->sem);
        return status;
 }
 
@@ -592,31 +565,36 @@ static int __devinit hwicap_setup(struct device *dev, int id,
 
        dev_info(dev, "Xilinx icap port driver\n");
 
+       mutex_lock(&icap_sem);
+
        if (id < 0) {
                for (id = 0; id < HWICAP_DEVICES; id++)
                        if (!probed_devices[id])
                                break;
        }
        if (id < 0 || id >= HWICAP_DEVICES) {
+               mutex_unlock(&icap_sem);
                dev_err(dev, "%s%i too large\n", DRIVER_NAME, id);
                return -EINVAL;
        }
        if (probed_devices[id]) {
+               mutex_unlock(&icap_sem);
                dev_err(dev, "cannot assign to %s%i; it is already in use\n",
                        DRIVER_NAME, id);
                return -EBUSY;
        }
 
        probed_devices[id] = 1;
+       mutex_unlock(&icap_sem);
 
        devt = MKDEV(xhwicap_major, xhwicap_minor + id);
 
-       drvdata = kmalloc(sizeof(struct hwicap_drvdata), GFP_KERNEL);
+       drvdata = kzalloc(sizeof(struct hwicap_drvdata), GFP_KERNEL);
        if (!drvdata) {
                dev_err(dev, "Couldn't allocate device private record\n");
-               return -ENOMEM;
+               retval = -ENOMEM;
+               goto failed0;
        }
-       memset((void *)drvdata, 0, sizeof(struct hwicap_drvdata));
        dev_set_drvdata(dev, (void *)drvdata);
 
        if (!regs_res) {
@@ -648,7 +626,7 @@ static int __devinit hwicap_setup(struct device *dev, int id,
        drvdata->config = config;
        drvdata->config_regs = config_regs;
 
-       init_MUTEX(&drvdata->sem);
+       mutex_init(&drvdata->sem);
        drvdata->is_open = 0;
 
        dev_info(dev, "ioremap %lx to %p with size %x\n",
@@ -663,7 +641,7 @@ static int __devinit hwicap_setup(struct device *dev, int id,
                goto failed3;
        }
        /*  devfs_mk_cdev(devt, S_IFCHR|S_IRUGO|S_IWUGO, DRIVER_NAME); */
-       class_device_create(icap_class, NULL, devt, NULL, DRIVER_NAME);
+       device_create(icap_class, dev, devt, "%s%d", DRIVER_NAME, id);
        return 0;               /* success */
 
  failed3:
@@ -675,6 +653,11 @@ static int __devinit hwicap_setup(struct device *dev, int id,
  failed1:
        kfree(drvdata);
 
+ failed0:
+       mutex_lock(&icap_sem);
+       probed_devices[id] = 0;
+       mutex_unlock(&icap_sem);
+
        return retval;
 }
 
@@ -699,14 +682,16 @@ static int __devexit hwicap_remove(struct device *dev)
        if (!drvdata)
                return 0;
 
-       class_device_destroy(icap_class, drvdata->devt);
+       device_destroy(icap_class, drvdata->devt);
        cdev_del(&drvdata->cdev);
        iounmap(drvdata->base_address);
        release_mem_region(drvdata->mem_start, drvdata->mem_size);
        kfree(drvdata);
        dev_set_drvdata(dev, NULL);
-       probed_devices[MINOR(dev->devt)-xhwicap_minor] = 0;
 
+       mutex_lock(&icap_sem);
+       probed_devices[MINOR(dev->devt)-xhwicap_minor] = 0;
+       mutex_unlock(&icap_sem);
        return 0;               /* success */
 }
 
@@ -821,28 +806,29 @@ static struct of_platform_driver hwicap_of_driver = {
 };
 
 /* Registration helpers to keep the number of #ifdefs to a minimum */
-static inline int __devinit hwicap_of_register(void)
+static inline int __init hwicap_of_register(void)
 {
        pr_debug("hwicap: calling of_register_platform_driver()\n");
        return of_register_platform_driver(&hwicap_of_driver);
 }
 
-static inline void __devexit hwicap_of_unregister(void)
+static inline void __exit hwicap_of_unregister(void)
 {
        of_unregister_platform_driver(&hwicap_of_driver);
 }
 #else /* CONFIG_OF */
 /* CONFIG_OF not enabled; do nothing helpers */
-static inline int __devinit hwicap_of_register(void) { return 0; }
-static inline void __devexit hwicap_of_unregister(void) { }
+static inline int __init hwicap_of_register(void) { return 0; }
+static inline void __exit hwicap_of_unregister(void) { }
 #endif /* CONFIG_OF */
 
-static int __devinit hwicap_module_init(void)
+static int __init hwicap_module_init(void)
 {
        dev_t devt;
        int retval;
 
        icap_class = class_create(THIS_MODULE, "xilinx_config");
+       mutex_init(&icap_sem);
 
        if (xhwicap_major) {
                devt = MKDEV(xhwicap_major, xhwicap_minor);
@@ -883,7 +869,7 @@ static int __devinit hwicap_module_init(void)
        return retval;
 }
 
-static void __devexit hwicap_module_cleanup(void)
+static void __exit hwicap_module_cleanup(void)
 {
        dev_t devt = MKDEV(xhwicap_major, xhwicap_minor);
 
index ae771cac16298b1c675e3f9de902880898e75a78..405fee7e189bd72da5ff8d08514ad141a03771f3 100644 (file)
@@ -48,9 +48,9 @@ struct hwicap_drvdata {
        u8 write_buffer[4];
        u32 read_buffer_in_use;   /* Always in [0,3] */
        u8 read_buffer[4];
-       u32 mem_start;            /* phys. address of the control registers */
-       u32 mem_end;              /* phys. address of the control registers */
-       u32 mem_size;
+       resource_size_t mem_start;/* phys. address of the control registers */
+       resource_size_t mem_end;  /* phys. address of the control registers */
+       resource_size_t mem_size;
        void __iomem *base_address;/* virt. address of the control registers */
 
        struct device *dev;
@@ -61,7 +61,7 @@ struct hwicap_drvdata {
        const struct config_registers *config_regs;
        void *private_data;
        bool is_open;
-       struct semaphore sem;
+       struct mutex sem;
 };
 
 struct hwicap_driver_config {
@@ -164,29 +164,29 @@ struct config_registers {
 #define XHI_DISABLED_AUTO_CRC       0x0000DEFCUL
 
 /**
- * hwicap_type_1_read: Generates a Type 1 read packet header.
- * @parameter: Register is the address of the register to be read back.
+ * hwicap_type_1_read - Generates a Type 1 read packet header.
+ * @reg: is the address of the register to be read back.
  *
  * Generates a Type 1 read packet header, which is used to indirectly
  * read registers in the configuration logic.  This packet must then
  * be sent through the icap device, and a return packet received with
  * the information.
  **/
-static inline u32 hwicap_type_1_read(u32 Register)
+static inline u32 hwicap_type_1_read(u32 reg)
 {
        return (XHI_TYPE_1 << XHI_TYPE_SHIFT) |
-               (Register << XHI_REGISTER_SHIFT) |
+               (reg << XHI_REGISTER_SHIFT) |
                (XHI_OP_READ << XHI_OP_SHIFT);
 }
 
 /**
- * hwicap_type_1_write: Generates a Type 1 write packet header
- * @parameter: Register is the address of the register to be read back.
+ * hwicap_type_1_write - Generates a Type 1 write packet header
+ * @reg: is the address of the register to be read back.
  **/
-static inline u32 hwicap_type_1_write(u32 Register)
+static inline u32 hwicap_type_1_write(u32 reg)
 {
        return (XHI_TYPE_1 << XHI_TYPE_SHIFT) |
-               (Register << XHI_REGISTER_SHIFT) |
+               (reg << XHI_REGISTER_SHIFT) |
                (XHI_OP_WRITE << XHI_OP_SHIFT);
 }