drivers/gpib/nec7210/nec7210.c

Source file repositories/reference/linux-study-clean/drivers/gpib/nec7210/nec7210.c

File Facts

System
Linux kernel
Corpus path
drivers/gpib/nec7210/nec7210.c
Extension
.c
Size
30368 bytes
Lines
1110
Domain
Driver Families
Bucket
drivers/gpib
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

if ((address_status_bits & HR_NATN)) {
			if (address_status_bits & HR_SPMS)
				priv->talker_state = serial_poll_active;
			else
				priv->talker_state = talker_active;
		} else {
			priv->talker_state = talker_addressed;
		}
	} else {
		priv->talker_state = talker_idle;
	}
}

static void update_listener_state(struct nec7210_priv *priv, unsigned int address_status_bits)
{
	if (address_status_bits & HR_LA) {
		if ((address_status_bits & HR_NATN))
			priv->listener_state = listener_active;
		else
			priv->listener_state = listener_addressed;
	} else {
		priv->listener_state = listener_idle;
	}
}

unsigned int nec7210_update_status_nolock(struct gpib_board *board, struct nec7210_priv *priv)
{
	int address_status_bits;
	u8 spoll_status;

	if (!priv)
		return 0;

	address_status_bits = read_byte(priv, ADSR);
	if (address_status_bits & HR_CIC)
		set_bit(CIC_NUM, &board->status);
	else
		clear_bit(CIC_NUM, &board->status);
	// check for talker/listener addressed
	update_talker_state(priv, address_status_bits);
	if (priv->talker_state == talker_active || priv->talker_state == talker_addressed)
		set_bit(TACS_NUM, &board->status);
	else
		clear_bit(TACS_NUM, &board->status);
	update_listener_state(priv, address_status_bits);
	if (priv->listener_state == listener_active ||
	    priv->listener_state == listener_addressed)
		set_bit(LACS_NUM, &board->status);
	else
		clear_bit(LACS_NUM, &board->status);
	if (address_status_bits & HR_NATN)
		clear_bit(ATN_NUM, &board->status);
	else
		set_bit(ATN_NUM, &board->status);
	spoll_status = nec7210_serial_poll_status(board, priv);
	if (priv->srq_pending && (spoll_status & request_service_bit) == 0) {
		priv->srq_pending = 0;
		set_bit(SPOLL_NUM, &board->status);
	}

	/*
	 * we rely on the interrupt handler to set the
	 * rest of the status bits
	 */

	return board->status;
}
EXPORT_SYMBOL(nec7210_update_status_nolock);

unsigned int nec7210_update_status(struct gpib_board *board, struct nec7210_priv *priv,
				   unsigned int clear_mask)
{
	unsigned long flags;
	unsigned int retval;

	spin_lock_irqsave(&board->spinlock, flags);
	board->status &= ~clear_mask;
	retval = nec7210_update_status_nolock(board, priv);
	spin_unlock_irqrestore(&board->spinlock, flags);

	return retval;
}
EXPORT_SYMBOL(nec7210_update_status);

unsigned int nec7210_set_reg_bits(struct nec7210_priv *priv, unsigned int reg,
				  unsigned int mask, unsigned int bits)
{
	priv->reg_bits[reg] &= ~mask;
	priv->reg_bits[reg] |= mask & bits;
	write_byte(priv, priv->reg_bits[reg], reg);

Annotation

Implementation Notes