Ticket #2306: hwmon-w83781d-fix-pnp-io-conflict.patch

File hwmon-w83781d-fix-pnp-io-conflict.patch, 2.5 KB (added by khali, 4 years ago)

Fix resource conflict between w83781d and pnp

  • drivers/hwmon/w83781d.c

    Only request I/O ports 0x295-0x296 instead of the full I/O address
    range. This solves a conflict with PNP resources on a few motherboards.
    
    Also request the I/O ports in two parts (4 low ports, 4 high ports)
    during device detection, otherwise the PNP resource make the request
    (and thus the detection) fail.
    
    Signed-off-by: Jean Delvare <khali@linux-fr.org>
    ---
     drivers/hwmon/w83781d.c |   21 ++++++++++++++++-----
     1 file changed, 16 insertions(+), 5 deletions(-)
    
    old new  
    13671367 
    13681368        /* Reserve the ISA region */ 
    13691369        res = platform_get_resource(pdev, IORESOURCE_IO, 0); 
    1370         if (!request_region(res->start, W83781D_EXTENT, "w83781d")) { 
     1370        if (!request_region(res->start + W83781D_ADDR_REG_OFFSET, 2, 
     1371                            "w83781d")) { 
    13711372                err = -EBUSY; 
    13721373                goto exit; 
    13731374        } 
     
    14151416        device_remove_file(&pdev->dev, &dev_attr_name); 
    14161417        kfree(data); 
    14171418 exit_release_region: 
    1418         release_region(res->start, W83781D_EXTENT); 
     1419        release_region(res->start + W83781D_ADDR_REG_OFFSET, 2); 
    14191420 exit: 
    14201421        return err; 
    14211422} 
     
    14291430        sysfs_remove_group(&pdev->dev.kobj, &w83781d_group); 
    14301431        sysfs_remove_group(&pdev->dev.kobj, &w83781d_group_opt); 
    14311432        device_remove_file(&pdev->dev, &dev_attr_name); 
    1432         release_region(data->client.addr, W83781D_EXTENT); 
     1433        release_region(data->client.addr + W83781D_ADDR_REG_OFFSET, 2); 
    14331434        kfree(data); 
    14341435 
    14351436        return 0; 
     
    17971798{ 
    17981799        int val, save, found = 0; 
    17991800 
    1800         if (!request_region(address, W83781D_EXTENT, "w83781d")) 
     1801        /* We have to request the region in two parts because some 
     1802           boards declare base+4 to base+7 as a PNP device */ 
     1803        if (!request_region(address, 4, "w83781d")) { 
     1804                pr_debug("w83781d: Failed to request low part of region\n"); 
    18011805                return 0; 
     1806        } 
     1807        if (!request_region(address + 4, 4, "w83781d")) { 
     1808                pr_debug("w83781d: Failed to request high part of region\n"); 
     1809                release_region(address, 4); 
     1810                return 0; 
     1811        } 
    18021812 
    18031813#define REALLY_SLOW_IO 
    18041814        /* We need the timeouts for at least some W83781D-like 
     
    18711881                        val == 0x30 ? "W83782D" : "W83781D", (int)address); 
    18721882 
    18731883 release: 
    1874         release_region(address, W83781D_EXTENT); 
     1884        release_region(address, 4); 
     1885        release_region(address + 4, 4); 
    18751886        return found; 
    18761887} 
    18771888