Skip to content

Commit

Permalink
eeprom-93cx6: Add (read-only) support for 8-bit mode
Browse files Browse the repository at this point in the history
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: Ondrej Zary <linux@rainbow-software.org>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Christoph Hellwig <hch@lst.de>
  • Loading branch information
Ondrej Zary authored and Christoph Hellwig committed Nov 25, 2014
1 parent 68b14b8 commit 7ff28ae
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 1 deletion.
62 changes: 61 additions & 1 deletion drivers/misc/eeprom/eeprom_93cx6.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions include/linux/eeprom_93cx6.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down

0 comments on commit 7ff28ae

Please sign in to comment.