Commit 197027e6ef830d60e10f76efc8d12bf3b6c35db5

Authored by Jean Delvare
1 parent 85f8d3e5fa

hwmon: (lm78) Request I/O ports individually for probing

Different motherboards have different PNP declarations for LM78/LM79
chips. Some declare the whole range of I/O ports (8 ports), some
declare only the useful ports (2 ports at offset 5) and some declare
fancy ranges, for example 4 ports at offset 4. To properly handle all
cases, request all ports individually for probing. After we have
determined that we really have an LM78 or LM79 chip, the useful port
range will be requested again, as a single block.

This fixes the driver on the Olivetti M3000 DT 540, at least.

Signed-off-by: Jean Delvare <khali@linux-fr.org>
Cc: stable@kernel.org

Showing 1 changed file with 12 additions and 13 deletions Side-by-side Diff

drivers/hwmon/lm78.c
... ... @@ -851,18 +851,17 @@
851 851 static int __init lm78_isa_found(unsigned short address)
852 852 {
853 853 int val, save, found = 0;
  854 + int port;
854 855  
855   - /* We have to request the region in two parts because some
856   - boards declare base+4 to base+7 as a PNP device */
857   - if (!request_region(address, 4, "lm78")) {
858   - pr_debug("lm78: Failed to request low part of region\n");
859   - return 0;
  856 + /* Some boards declare base+0 to base+7 as a PNP device, some base+4
  857 + * to base+7 and some base+5 to base+6. So we better request each port
  858 + * individually for the probing phase. */
  859 + for (port = address; port < address + LM78_EXTENT; port++) {
  860 + if (!request_region(port, 1, "lm78")) {
  861 + pr_debug("lm78: Failed to request port 0x%x\n", port);
  862 + goto release;
  863 + }
860 864 }
861   - if (!request_region(address + 4, 4, "lm78")) {
862   - pr_debug("lm78: Failed to request high part of region\n");
863   - release_region(address, 4);
864   - return 0;
865   - }
866 865  
867 866 #define REALLY_SLOW_IO
868 867 /* We need the timeouts for at least some LM78-like
... ... @@ -925,8 +924,8 @@
925 924 val & 0x80 ? "LM79" : "LM78", (int)address);
926 925  
927 926 release:
928   - release_region(address + 4, 4);
929   - release_region(address, 4);
  927 + for (port--; port >= address; port--)
  928 + release_region(port, 1);
930 929 return found;
931 930 }
932 931