drivers/fpga/lattice-sysconfig.c

Source file repositories/reference/linux-study-clean/drivers/fpga/lattice-sysconfig.c

File Facts

System
Linux kernel
Corpus path
drivers/fpga/lattice-sysconfig.c
Extension
.c
Size
8920 bytes
Lines
398
Domain
Driver Families
Bucket
drivers/fpga
Inferred role
Driver Families: exported/initcall integration point
Status
integration implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

// SPDX-License-Identifier: GPL-2.0
/*
 * Lattice FPGA sysCONFIG interface functions independent of port type.
 */

#include <linux/delay.h>
#include <linux/fpga/fpga-mgr.h>
#include <linux/gpio/consumer.h>
#include <linux/iopoll.h>

#include "lattice-sysconfig.h"

static int sysconfig_cmd_write(struct sysconfig_priv *priv, const void *buf,
			       size_t buf_len)
{
	return priv->command_transfer(priv, buf, buf_len, NULL, 0);
}

static int sysconfig_cmd_read(struct sysconfig_priv *priv, const void *tx_buf,
			      size_t tx_len, void *rx_buf, size_t rx_len)
{
	return priv->command_transfer(priv, tx_buf, tx_len, rx_buf, rx_len);
}

static int sysconfig_read_busy(struct sysconfig_priv *priv)
{
	const u8 lsc_check_busy[] = SYSCONFIG_LSC_CHECK_BUSY;
	u8 busy;
	int ret;

	ret = sysconfig_cmd_read(priv, lsc_check_busy, sizeof(lsc_check_busy),
				 &busy, sizeof(busy));

	return ret ? : busy;
}

static int sysconfig_poll_busy(struct sysconfig_priv *priv)
{
	int ret, busy;

	ret = read_poll_timeout(sysconfig_read_busy, busy, busy <= 0,
				SYSCONFIG_POLL_INTERVAL_US,
				SYSCONFIG_POLL_BUSY_TIMEOUT_US, false, priv);

	return ret ? : busy;
}

static int sysconfig_read_status(struct sysconfig_priv *priv, u32 *status)
{
	const u8 lsc_read_status[] = SYSCONFIG_LSC_READ_STATUS;
	__be32 device_status;
	int ret;

	ret = sysconfig_cmd_read(priv, lsc_read_status, sizeof(lsc_read_status),
				 &device_status, sizeof(device_status));
	if (ret)
		return ret;

	*status = be32_to_cpu(device_status);

	return 0;
}

static int sysconfig_poll_status(struct sysconfig_priv *priv, u32 *status)
{
	int ret = sysconfig_poll_busy(priv);

	if (ret)
		return ret;

	return sysconfig_read_status(priv, status);
}

static int sysconfig_poll_gpio(struct gpio_desc *gpio, bool is_active)
{
	int ret, val;

	ret = read_poll_timeout(gpiod_get_value, val,
				val < 0 || !!val == is_active,
				SYSCONFIG_POLL_INTERVAL_US,
				SYSCONFIG_POLL_GPIO_TIMEOUT_US, false, gpio);

	if (val < 0)
		return val;

	return ret;
}

static int sysconfig_gpio_refresh(struct sysconfig_priv *priv)
{

Annotation

Implementation Notes