mfd: wm8994: Return error when device ID mismatch is detected
Subsystems (2)
PATCH 1/1 mfd: wm8994: Return error when device ID mismatch is detected
We base on wm8994->type to set wm8994->supplies and wm8994->num_supplies. But in current code, wm8994->type may be changed when device ID mismatch is detected. If we change wm8994->type, then the wm8994->supplies and wm8994->num_supplies settings are wrong.
Fix it by return error immediately when device ID mismatch is detected.
--- drivers/mfd/wm8994-core.c | 32 +++++++------------------------- 1 files changed, 7 insertions(+), 25 deletions(-)
drivers/mfd/wm8994-core.c +7 -25
@@ -415,14 +415,17 @@ static __devinit int wm8994_device_init(struct wm8994 *wm8994, int irq)switch (wm8994->type) {case WM1811 : + devname ="WM1811" ;for (i =0 ; i <ARRAY_SIZE (wm1811_main_supplies); i++) wm8994->supplies[i].supply = wm1811_main_supplies[i];break ;case WM8994 : + devname ="WM8994" ;for (i =0 ; i <ARRAY_SIZE (wm8994_main_supplies); i++) wm8994->supplies[i].supply = wm8994_main_supplies[i];break ;case WM8958 : + devname ="WM8958" ;for (i =0 ; i <ARRAY_SIZE (wm8958_main_supplies); i++) wm8994->supplies[i].supply = wm8958_main_supplies[i];break ;
@@ -450,31 +453,10 @@ static __devinit int wm8994_device_init(struct wm8994 *wm8994, int irq)dev_err (wm8994->dev,"Failed to read ID register\n" ); goto err_enable; } -switch (ret) { -case 0x1811 : - devname ="WM1811" ; -if (wm8994->type !=WM1811 ) -dev_warn (wm8994->dev,"Device registered as type %d\n" , - wm8994->type); - wm8994->type =WM1811 ; -break ; -case 0x8994 : - devname ="WM8994" ; -if (wm8994->type !=WM8994 ) -dev_warn (wm8994->dev,"Device registered as type %d\n" , - wm8994->type); - wm8994->type =WM8994 ; -break ; -case 0x8958 : - devname ="WM8958" ; -if (wm8994->type !=WM8958 ) -dev_warn (wm8994->dev,"Device registered as type %d\n" , - wm8994->type); - wm8994->type =WM8958 ; -break ; -default : -dev_err (wm8994->dev,"Device is not a WM8994, ID is %x\n" , - ret); + +if (ret != wm8994->type) { +dev_err (wm8994->dev,"Device ID mismatch: expect %x but we got %x\n" , + wm8994->type, ret); ret = -EINVAL ; goto err_enable; }
Signature · 1 line
1.7.5.4
Quoted 6 lines · Axel Lin
We base on
wm8994->typeto setwm8994->suppliesandwm8994->num_supplies. But in current code,wm8994->typemay be changed when device ID mismatch is detected. If we changewm8994->type, then thewm8994->suppliesandwm8994->num_suppliessettings are wrong.Fix it by return error immediately when device ID mismatch is detected.
No, there are valid use cases for registering as the wrong device. It's not ideal to have the wrong supply set but it's going to cause more harm than good to fail hard on this.