| From a3325d225b00889f4b7fdb25d83033cae1048a92 Mon Sep 17 00:00:00 2001 |
| From: Terry Bowman <terry.bowman@amd.com> |
| Date: Wed, 9 Feb 2022 11:27:11 -0600 |
| Subject: i2c: piix4: Move port I/O region request/release code into functions |
| |
| From: Terry Bowman <terry.bowman@amd.com> |
| |
| commit a3325d225b00889f4b7fdb25d83033cae1048a92 upstream. |
| |
| Move duplicated region request and release code into a function. Move is |
| in preparation for following MMIO changes. |
| |
| Signed-off-by: Terry Bowman <terry.bowman@amd.com> |
| Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> |
| Reviewed-by: Jean Delvare <jdelvare@suse.de> |
| [wsa: added missing curly brace] |
| Signed-off-by: Wolfram Sang <wsa@kernel.org> |
| Cc: Mario Limonciello <Mario.Limonciello@amd.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/i2c/busses/i2c-piix4.c | 48 ++++++++++++++++++++++++++--------------- |
| 1 file changed, 31 insertions(+), 17 deletions(-) |
| |
| --- a/drivers/i2c/busses/i2c-piix4.c |
| +++ b/drivers/i2c/busses/i2c-piix4.c |
| @@ -165,6 +165,24 @@ struct i2c_piix4_adapdata { |
| u8 port; /* Port number, shifted */ |
| }; |
| |
| +static int piix4_sb800_region_request(struct device *dev) |
| +{ |
| + if (!request_muxed_region(SB800_PIIX4_SMB_IDX, SB800_PIIX4_SMB_MAP_SIZE, |
| + "sb800_piix4_smb")) { |
| + dev_err(dev, |
| + "SMBus base address index region 0x%x already in use.\n", |
| + SB800_PIIX4_SMB_IDX); |
| + return -EBUSY; |
| + } |
| + |
| + return 0; |
| +} |
| + |
| +static void piix4_sb800_region_release(struct device *dev) |
| +{ |
| + release_region(SB800_PIIX4_SMB_IDX, SB800_PIIX4_SMB_MAP_SIZE); |
| +} |
| + |
| static int piix4_setup(struct pci_dev *PIIX4_dev, |
| const struct pci_device_id *id) |
| { |
| @@ -270,6 +288,7 @@ static int piix4_setup_sb800(struct pci_ |
| unsigned short piix4_smba; |
| u8 smba_en_lo, smba_en_hi, smb_en, smb_en_status, port_sel; |
| u8 i2ccfg, i2ccfg_offset = 0x10; |
| + int retval; |
| |
| /* SB800 and later SMBus does not support forcing address */ |
| if (force || force_addr) { |
| @@ -291,20 +310,16 @@ static int piix4_setup_sb800(struct pci_ |
| else |
| smb_en = (aux) ? 0x28 : 0x2c; |
| |
| - if (!request_muxed_region(SB800_PIIX4_SMB_IDX, SB800_PIIX4_SMB_MAP_SIZE, |
| - "sb800_piix4_smb")) { |
| - dev_err(&PIIX4_dev->dev, |
| - "SMB base address index region 0x%x already in use.\n", |
| - SB800_PIIX4_SMB_IDX); |
| - return -EBUSY; |
| - } |
| + retval = piix4_sb800_region_request(&PIIX4_dev->dev); |
| + if (retval) |
| + return retval; |
| |
| outb_p(smb_en, SB800_PIIX4_SMB_IDX); |
| smba_en_lo = inb_p(SB800_PIIX4_SMB_IDX + 1); |
| outb_p(smb_en + 1, SB800_PIIX4_SMB_IDX); |
| smba_en_hi = inb_p(SB800_PIIX4_SMB_IDX + 1); |
| |
| - release_region(SB800_PIIX4_SMB_IDX, SB800_PIIX4_SMB_MAP_SIZE); |
| + piix4_sb800_region_release(&PIIX4_dev->dev); |
| |
| if (!smb_en) { |
| smb_en_status = smba_en_lo & 0x10; |
| @@ -373,11 +388,10 @@ static int piix4_setup_sb800(struct pci_ |
| piix4_port_shift_sb800 = SB800_PIIX4_PORT_IDX_SHIFT; |
| } |
| } else { |
| - if (!request_muxed_region(SB800_PIIX4_SMB_IDX, |
| - SB800_PIIX4_SMB_MAP_SIZE, |
| - "sb800_piix4_smb")) { |
| + retval = piix4_sb800_region_request(&PIIX4_dev->dev); |
| + if (retval) { |
| release_region(piix4_smba, SMBIOSIZE); |
| - return -EBUSY; |
| + return retval; |
| } |
| |
| outb_p(SB800_PIIX4_PORT_IDX_SEL, SB800_PIIX4_SMB_IDX); |
| @@ -387,7 +401,7 @@ static int piix4_setup_sb800(struct pci_ |
| SB800_PIIX4_PORT_IDX; |
| piix4_port_mask_sb800 = SB800_PIIX4_PORT_IDX_MASK; |
| piix4_port_shift_sb800 = SB800_PIIX4_PORT_IDX_SHIFT; |
| - release_region(SB800_PIIX4_SMB_IDX, SB800_PIIX4_SMB_MAP_SIZE); |
| + piix4_sb800_region_release(&PIIX4_dev->dev); |
| } |
| |
| dev_info(&PIIX4_dev->dev, |
| @@ -685,9 +699,9 @@ static s32 piix4_access_sb800(struct i2c |
| u8 port; |
| int retval; |
| |
| - if (!request_muxed_region(SB800_PIIX4_SMB_IDX, SB800_PIIX4_SMB_MAP_SIZE, |
| - "sb800_piix4_smb")) |
| - return -EBUSY; |
| + retval = piix4_sb800_region_request(&adap->dev); |
| + if (retval) |
| + return retval; |
| |
| /* Request the SMBUS semaphore, avoid conflicts with the IMC */ |
| smbslvcnt = inb_p(SMBSLVCNT); |
| @@ -762,7 +776,7 @@ static s32 piix4_access_sb800(struct i2c |
| piix4_imc_wakeup(); |
| |
| release: |
| - release_region(SB800_PIIX4_SMB_IDX, SB800_PIIX4_SMB_MAP_SIZE); |
| + piix4_sb800_region_release(&adap->dev); |
| return retval; |
| } |
| |