Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7ff28aee authored by Ondrej Zary's avatar Ondrej Zary Committed by Christoph Hellwig
Browse files

eeprom-93cx6: Add (read-only) support for 8-bit mode



Add read-only support for EEPROMs configured in 8-bit mode (ORG pin connected
to GND).
This will be used by wd719x driver.

Signed-off-by: default avatarOndrej Zary <linux@rainbow-software.org>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent 68b14b8f
Loading
Loading
Loading
Loading
+61 −1
Original line number Diff line number Diff line
@@ -170,7 +170,7 @@ static void eeprom_93cx6_read_bits(struct eeprom_93cx6 *eeprom,
}

/**
 * eeprom_93cx6_read - Read multiple words from eeprom
 * eeprom_93cx6_read - Read a word from eeprom
 * @eeprom: Pointer to eeprom structure
 * @word: Word index from where we should start reading
 * @data: target pointer where the information will have to be stored
@@ -234,6 +234,66 @@ void eeprom_93cx6_multiread(struct eeprom_93cx6 *eeprom, const u8 word,
}
EXPORT_SYMBOL_GPL(eeprom_93cx6_multiread);

/**
 * eeprom_93cx6_readb - Read a byte from eeprom
 * @eeprom: Pointer to eeprom structure
 * @word: Byte index from where we should start reading
 * @data: target pointer where the information will have to be stored
 *
 * This function will read a byte of the eeprom data
 * into the given data pointer.
 */
void eeprom_93cx6_readb(struct eeprom_93cx6 *eeprom, const u8 byte,
	u8 *data)
{
	u16 command;
	u16 tmp;

	/*
	 * Initialize the eeprom register
	 */
	eeprom_93cx6_startup(eeprom);

	/*
	 * Select the read opcode and the byte to be read.
	 */
	command = (PCI_EEPROM_READ_OPCODE << (eeprom->width + 1)) | byte;
	eeprom_93cx6_write_bits(eeprom, command,
		PCI_EEPROM_WIDTH_OPCODE + eeprom->width + 1);

	/*
	 * Read the requested 8 bits.
	 */
	eeprom_93cx6_read_bits(eeprom, &tmp, 8);
	*data = tmp & 0xff;

	/*
	 * Cleanup eeprom register.
	 */
	eeprom_93cx6_cleanup(eeprom);
}
EXPORT_SYMBOL_GPL(eeprom_93cx6_readb);

/**
 * eeprom_93cx6_multireadb - Read multiple bytes from eeprom
 * @eeprom: Pointer to eeprom structure
 * @byte: Index from where we should start reading
 * @data: target pointer where the information will have to be stored
 * @words: Number of bytes that should be read.
 *
 * This function will read all requested bytes from the eeprom,
 * this is done by calling eeprom_93cx6_readb() multiple times.
 */
void eeprom_93cx6_multireadb(struct eeprom_93cx6 *eeprom, const u8 byte,
	u8 *data, const u16 bytes)
{
	unsigned int i;

	for (i = 0; i < bytes; i++)
		eeprom_93cx6_readb(eeprom, byte + i, &data[i]);
}
EXPORT_SYMBOL_GPL(eeprom_93cx6_multireadb);

/**
 * eeprom_93cx6_wren - set the write enable state
 * @eeprom: Pointer to eeprom structure
+4 −0
Original line number Diff line number Diff line
@@ -75,6 +75,10 @@ extern void eeprom_93cx6_read(struct eeprom_93cx6 *eeprom,
	const u8 word, u16 *data);
extern void eeprom_93cx6_multiread(struct eeprom_93cx6 *eeprom,
	const u8 word, __le16 *data, const u16 words);
extern void eeprom_93cx6_readb(struct eeprom_93cx6 *eeprom,
	const u8 byte, u8 *data);
extern void eeprom_93cx6_multireadb(struct eeprom_93cx6 *eeprom,
	const u8 byte, u8 *data, const u16 bytes);

extern void eeprom_93cx6_wren(struct eeprom_93cx6 *eeprom, bool enable);