]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
misc: eeprom: Fix EWEN/EWDS/ERAL commands for 93xx56 and 93xx66
authorMarkus Perkins <markus@notsyncing.net>
Tue, 2 Dec 2025 10:48:24 +0000 (11:48 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 29 Dec 2025 10:54:15 +0000 (11:54 +0100)
commit 14374fbb3f06 ("misc: eeprom_93xx46: Add new 93c56 and 93c66
compatible strings") added support for 93xx56 and 93xx66 eeproms, but
didn't take into account that the write enable/disable + erase all
commands are hardcoded for the 6-bit address of the 93xx46.

This commit fixes the command word generation by increasing the number
of shifts as the address field grows, keeping the command intact.

Also, the check for 8-bit or 16-bit mode is no longer required as this
is already taken into account in the edev->addrlen field.

Signed-off-by: Markus Perkins <markus@notsyncing.net>
Link: https://patch.msgid.link/20251202104823.429869-3-markus@notsyncing.net
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/eeprom/eeprom_93xx46.c

index 9cae6f530679b3e5ee6ed721f952cb6d8f4e216f..5230e910a1d11e6007ccc8be6228ed59f612de57 100644 (file)
@@ -45,6 +45,7 @@ struct eeprom_93xx46_platform_data {
 #define OP_START       0x4
 #define OP_WRITE       (OP_START | 0x1)
 #define OP_READ                (OP_START | 0x2)
+/* The following addresses are offset for the 1K EEPROM variant in 16-bit mode */
 #define ADDR_EWDS      0x00
 #define ADDR_ERAL      0x20
 #define ADDR_EWEN      0x30
@@ -191,10 +192,7 @@ static int eeprom_93xx46_ew(struct eeprom_93xx46_dev *edev, int is_on)
        bits = edev->addrlen + 3;
 
        cmd_addr = OP_START << edev->addrlen;
-       if (edev->pdata->flags & EE_ADDR8)
-               cmd_addr |= (is_on ? ADDR_EWEN : ADDR_EWDS) << 1;
-       else
-               cmd_addr |= (is_on ? ADDR_EWEN : ADDR_EWDS);
+       cmd_addr |= (is_on ? ADDR_EWEN : ADDR_EWDS) << (edev->addrlen - 6);
 
        if (has_quirk_instruction_length(edev)) {
                cmd_addr <<= 2;
@@ -328,10 +326,7 @@ static int eeprom_93xx46_eral(struct eeprom_93xx46_dev *edev)
        bits = edev->addrlen + 3;
 
        cmd_addr = OP_START << edev->addrlen;
-       if (edev->pdata->flags & EE_ADDR8)
-               cmd_addr |= ADDR_ERAL << 1;
-       else
-               cmd_addr |= ADDR_ERAL;
+       cmd_addr |= ADDR_ERAL << (edev->addrlen - 6);
 
        if (has_quirk_instruction_length(edev)) {
                cmd_addr <<= 2;