]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/2.6.32.9/hwmon-lm78-request-i-o-ports-individually-for-probing.patch
4.9-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 2.6.32.9 / hwmon-lm78-request-i-o-ports-individually-for-probing.patch
1 From 197027e6ef830d60e10f76efc8d12bf3b6c35db5 Mon Sep 17 00:00:00 2001
2 From: Jean Delvare <khali@linux-fr.org>
3 Date: Fri, 5 Feb 2010 19:58:36 +0100
4 Subject: hwmon: (lm78) Request I/O ports individually for probing
5
6 From: Jean Delvare <khali@linux-fr.org>
7
8 commit 197027e6ef830d60e10f76efc8d12bf3b6c35db5 upstream.
9
10 Different motherboards have different PNP declarations for LM78/LM79
11 chips. Some declare the whole range of I/O ports (8 ports), some
12 declare only the useful ports (2 ports at offset 5) and some declare
13 fancy ranges, for example 4 ports at offset 4. To properly handle all
14 cases, request all ports individually for probing. After we have
15 determined that we really have an LM78 or LM79 chip, the useful port
16 range will be requested again, as a single block.
17
18 This fixes the driver on the Olivetti M3000 DT 540, at least.
19
20 Signed-off-by: Jean Delvare <khali@linux-fr.org>
21 Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
22
23 ---
24 drivers/hwmon/lm78.c | 23 +++++++++++------------
25 1 file changed, 11 insertions(+), 12 deletions(-)
26
27 --- a/drivers/hwmon/lm78.c
28 +++ b/drivers/hwmon/lm78.c
29 @@ -870,17 +870,16 @@ static struct lm78_data *lm78_update_dev
30 static int __init lm78_isa_found(unsigned short address)
31 {
32 int val, save, found = 0;
33 + int port;
34
35 - /* We have to request the region in two parts because some
36 - boards declare base+4 to base+7 as a PNP device */
37 - if (!request_region(address, 4, "lm78")) {
38 - pr_debug("lm78: Failed to request low part of region\n");
39 - return 0;
40 - }
41 - if (!request_region(address + 4, 4, "lm78")) {
42 - pr_debug("lm78: Failed to request high part of region\n");
43 - release_region(address, 4);
44 - return 0;
45 + /* Some boards declare base+0 to base+7 as a PNP device, some base+4
46 + * to base+7 and some base+5 to base+6. So we better request each port
47 + * individually for the probing phase. */
48 + for (port = address; port < address + LM78_EXTENT; port++) {
49 + if (!request_region(port, 1, "lm78")) {
50 + pr_debug("lm78: Failed to request port 0x%x\n", port);
51 + goto release;
52 + }
53 }
54
55 #define REALLY_SLOW_IO
56 @@ -944,8 +943,8 @@ static int __init lm78_isa_found(unsigne
57 val & 0x80 ? "LM79" : "LM78", (int)address);
58
59 release:
60 - release_region(address + 4, 4);
61 - release_region(address, 4);
62 + for (port--; port >= address; port--)
63 + release_region(port, 1);
64 return found;
65 }
66