Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 91469
b: refs/heads/master
c: 6b06fdb
h: refs/heads/master
i:
  91467: 457a7f8
v: v3
  • Loading branch information
Stephen Neuendorffer authored and Josh Boyer committed Mar 26, 2008
1 parent 4a8efd2 commit 2ac95e7
Show file tree
Hide file tree
Showing 7 changed files with 59 additions and 28 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 783142635156b05f2e425852deb8ab71e9e1882a
refs/heads/master: 6b06fdbaf9eb9f208a83540265a6a82bf1049a41
22 changes: 5 additions & 17 deletions trunk/drivers/char/xilinx_hwicap/buffer_icap.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@

/**
* buffer_icap_get_status - Get the contents of the status register.
* @base_address: is the base address of the device
* @drvdata: a pointer to the drvdata.
*
* The status register contains the ICAP status and the done bit.
*
Expand All @@ -88,9 +88,9 @@
* D1 - Always 1
* D0 - Done bit
**/
static inline u32 buffer_icap_get_status(void __iomem *base_address)
u32 buffer_icap_get_status(struct hwicap_drvdata *drvdata)
{
return in_be32(base_address + XHI_STATUS_REG_OFFSET);
return in_be32(drvdata->base_address + XHI_STATUS_REG_OFFSET);
}

/**
Expand All @@ -117,20 +117,8 @@ static inline u32 buffer_icap_get_bram(void __iomem *base_address,
**/
static inline bool buffer_icap_busy(void __iomem *base_address)
{
return (buffer_icap_get_status(base_address) & 1) == XHI_NOT_FINISHED;
}

/**
* 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
* has completed.
**/
static inline bool buffer_icap_done(void __iomem *base_address)
{
return (buffer_icap_get_status(base_address) & 1) == XHI_FINISHED;
u32 status = in_be32(base_address + XHI_STATUS_REG_OFFSET);
return (status & 1) == XHI_NOT_FINISHED;
}

/**
Expand Down
5 changes: 3 additions & 2 deletions trunk/drivers/char/xilinx_hwicap/buffer_icap.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,6 @@
#include <asm/io.h>
#include "xilinx_hwicap.h"

void buffer_icap_reset(struct hwicap_drvdata *drvdata);

/* Loads a partial bitstream from system memory. */
int buffer_icap_set_configuration(struct hwicap_drvdata *drvdata, u32 *data,
u32 Size);
Expand All @@ -54,4 +52,7 @@ int buffer_icap_set_configuration(struct hwicap_drvdata *drvdata, u32 *data,
int buffer_icap_get_configuration(struct hwicap_drvdata *drvdata, u32 *data,
u32 Size);

u32 buffer_icap_get_status(struct hwicap_drvdata *drvdata);
void buffer_icap_reset(struct hwicap_drvdata *drvdata);

#endif
31 changes: 23 additions & 8 deletions trunk/drivers/char/xilinx_hwicap/fifo_icap.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,13 +78,6 @@
#define XHI_CR_READ_MASK 0x00000002 /* Read from ICAP to FIFO */
#define XHI_CR_WRITE_MASK 0x00000001 /* Write from FIFO to ICAP */

/* Status Register (SR) */
#define XHI_SR_CFGERR_N_MASK 0x00000100 /* Config Error Mask */
#define XHI_SR_DALIGN_MASK 0x00000080 /* Data Alignment Mask */
#define XHI_SR_RIP_MASK 0x00000040 /* Read back Mask */
#define XHI_SR_IN_ABORT_N_MASK 0x00000020 /* Select Map Abort Mask */
#define XHI_SR_DONE_MASK 0x00000001 /* Done bit Mask */


#define XHI_WFO_MAX_VACANCY 1024 /* Max Write FIFO Vacancy, in words */
#define XHI_RFO_MAX_OCCUPANCY 256 /* Max Read FIFO Occupancy, in words */
Expand Down Expand Up @@ -151,14 +144,36 @@ static inline void fifo_icap_start_readback(struct hwicap_drvdata *drvdata)
dev_dbg(drvdata->dev, "readback started\n");
}

/**
* fifo_icap_get_status - Get the contents of the status register.
* @drvdata: a pointer to the drvdata.
*
* The status register contains the ICAP status and the done bit.
*
* D8 - cfgerr
* D7 - dalign
* D6 - rip
* D5 - in_abort_l
* D4 - Always 1
* D3 - Always 1
* D2 - Always 1
* D1 - Always 1
* D0 - Done bit
**/
u32 fifo_icap_get_status(struct hwicap_drvdata *drvdata)
{
u32 status = in_be32(drvdata->base_address + XHI_SR_OFFSET);
dev_dbg(drvdata->dev, "Getting status = %x\n", status);
return status;
}

/**
* 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)
{
u32 status = in_be32(drvdata->base_address + XHI_SR_OFFSET);
dev_dbg(drvdata->dev, "Getting status = %x\n", status);
return (status & XHI_SR_DONE_MASK) ? 0 : 1;
}

Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/char/xilinx_hwicap/fifo_icap.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ int fifo_icap_set_configuration(
u32 *FrameBuffer,
u32 NumWords);

u32 fifo_icap_get_status(struct hwicap_drvdata *drvdata);
void fifo_icap_reset(struct hwicap_drvdata *drvdata);
void fifo_icap_flush_fifo(struct hwicap_drvdata *drvdata);

Expand Down
2 changes: 2 additions & 0 deletions trunk/drivers/char/xilinx_hwicap/xilinx_hwicap.c
Original file line number Diff line number Diff line change
Expand Up @@ -664,12 +664,14 @@ static int __devinit hwicap_setup(struct device *dev, int id,
static struct hwicap_driver_config buffer_icap_config = {
.get_configuration = buffer_icap_get_configuration,
.set_configuration = buffer_icap_set_configuration,
.get_status = buffer_icap_get_status,
.reset = buffer_icap_reset,
};

static struct hwicap_driver_config fifo_icap_config = {
.get_configuration = fifo_icap_get_configuration,
.set_configuration = fifo_icap_set_configuration,
.get_status = fifo_icap_get_status,
.reset = fifo_icap_reset,
};

Expand Down
24 changes: 24 additions & 0 deletions trunk/drivers/char/xilinx_hwicap/xilinx_hwicap.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,27 @@ struct hwicap_drvdata {
};

struct hwicap_driver_config {
/* Read configuration data given by size into the data buffer.
Return 0 if successful. */
int (*get_configuration)(struct hwicap_drvdata *drvdata, u32 *data,
u32 size);
/* Write configuration data given by size from the data buffer.
Return 0 if successful. */
int (*set_configuration)(struct hwicap_drvdata *drvdata, u32 *data,
u32 size);
/* Get the status register, bit pattern given by:
* D8 - 0 = configuration error
* D7 - 1 = alignment found
* D6 - 1 = readback in progress
* D5 - 0 = abort in progress
* D4 - Always 1
* D3 - Always 1
* D2 - Always 1
* D1 - Always 1
* D0 - 1 = operation completed
*/
u32 (*get_status)(struct hwicap_drvdata *drvdata);
/* Reset the hw */
void (*reset)(struct hwicap_drvdata *drvdata);
};

Expand Down Expand Up @@ -163,6 +180,13 @@ struct config_registers {
/* Constant to use for CRC check when CRC has been disabled */
#define XHI_DISABLED_AUTO_CRC 0x0000DEFCUL

/* Meanings of the bits returned by get_status */
#define XHI_SR_CFGERR_N_MASK 0x00000100 /* Config Error Mask */
#define XHI_SR_DALIGN_MASK 0x00000080 /* Data Alignment Mask */
#define XHI_SR_RIP_MASK 0x00000040 /* Read back Mask */
#define XHI_SR_IN_ABORT_N_MASK 0x00000020 /* Select Map Abort Mask */
#define XHI_SR_DONE_MASK 0x00000001 /* Done bit Mask */

/**
* hwicap_type_1_read - Generates a Type 1 read packet header.
* @reg: is the address of the register to be read back.
Expand Down

0 comments on commit 2ac95e7

Please sign in to comment.