Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

dpll: zl3073x: Handle missing or corrupted flash configuration

If the internal flash contains missing or corrupted configuration,
basic communication over the bus still functions, but the device
is not capable of normal operation (for example, using mailboxes).

This condition is indicated in the info register by the ready bit.
If this bit is cleared, the probe procedure times out while fetching
the device state.

Handle this case by checking the ready bit value in zl3073x_dev_start()
and skipping DPLL device and pin registration if it is cleared.
Do not report this condition as an error, allowing the devlink device
to be registered and enabling the user to flash the correct configuration.

Prior this patch:
[ 31.112299] zl3073x-i2c 1-0070: Failed to fetch input state: -ETIMEDOUT
[ 31.116332] zl3073x-i2c 1-0070: error -ETIMEDOUT: Failed to start device
[ 31.136881] zl3073x-i2c 1-0070: probe with driver zl3073x-i2c failed with error -110

After this patch:
[ 41.011438] zl3073x-i2c 1-0070: FW not fully ready - missing or corrupted config

Fixes: 75a71ecc24125 ("dpll: zl3073x: Register DPLL devices and pins")
Signed-off-by: Ivan Vecera <ivecera@redhat.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20251008141445.841113-1-ivecera@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Ivan Vecera and committed by
Jakub Kicinski
fcb8b32a 0b4b77ef

+24
+21
drivers/dpll/zl3073x/core.c
··· 1038 1038 int zl3073x_dev_start(struct zl3073x_dev *zldev, bool full) 1039 1039 { 1040 1040 struct zl3073x_dpll *zldpll; 1041 + u8 info; 1041 1042 int rc; 1043 + 1044 + rc = zl3073x_read_u8(zldev, ZL_REG_INFO, &info); 1045 + if (rc) { 1046 + dev_err(zldev->dev, "Failed to read device status info\n"); 1047 + return rc; 1048 + } 1049 + 1050 + if (!FIELD_GET(ZL_INFO_READY, info)) { 1051 + /* The ready bit indicates that the firmware was successfully 1052 + * configured and is ready for normal operation. If it is 1053 + * cleared then the configuration stored in flash is wrong 1054 + * or missing. In this situation the driver will expose 1055 + * only devlink interface to give an opportunity to flash 1056 + * the correct config. 1057 + */ 1058 + dev_info(zldev->dev, 1059 + "FW not fully ready - missing or corrupted config\n"); 1060 + 1061 + return 0; 1062 + } 1042 1063 1043 1064 if (full) { 1044 1065 /* Fetch device state */
+3
drivers/dpll/zl3073x/regs.h
··· 67 67 * Register Page 0, General 68 68 **************************/ 69 69 70 + #define ZL_REG_INFO ZL_REG(0, 0x00, 1) 71 + #define ZL_INFO_READY BIT(7) 72 + 70 73 #define ZL_REG_ID ZL_REG(0, 0x01, 2) 71 74 #define ZL_REG_REVISION ZL_REG(0, 0x03, 2) 72 75 #define ZL_REG_FW_VER ZL_REG(0, 0x05, 2)