40
40
#include <linux/dmi.h>
41
41
#include <linux/acpi.h>
42
42
#include <linux/io.h>
43
- #include <linux/mutex.h>
44
43
45
44
46
45
/* PIIX4 SMBus address offsets */
@@ -153,10 +152,7 @@ static const struct dmi_system_id piix4_dmi_ibm[] = {
153
152
154
153
/*
155
154
* SB800 globals
156
- * piix4_mutex_sb800 protects piix4_port_sel_sb800 and the pair
157
- * of I/O ports at SB800_PIIX4_SMB_IDX.
158
155
*/
159
- static DEFINE_MUTEX (piix4_mutex_sb800 );
160
156
static u8 piix4_port_sel_sb800 ;
161
157
static u8 piix4_port_mask_sb800 ;
162
158
static u8 piix4_port_shift_sb800 ;
@@ -298,12 +294,19 @@ static int piix4_setup_sb800(struct pci_dev *PIIX4_dev,
298
294
else
299
295
smb_en = (aux ) ? 0x28 : 0x2c ;
300
296
301
- mutex_lock (& piix4_mutex_sb800 );
297
+ if (!request_muxed_region (SB800_PIIX4_SMB_IDX , 2 , "sb800_piix4_smb" )) {
298
+ dev_err (& PIIX4_dev -> dev ,
299
+ "SMB base address index region 0x%x already in use.\n" ,
300
+ SB800_PIIX4_SMB_IDX );
301
+ return - EBUSY ;
302
+ }
303
+
302
304
outb_p (smb_en , SB800_PIIX4_SMB_IDX );
303
305
smba_en_lo = inb_p (SB800_PIIX4_SMB_IDX + 1 );
304
306
outb_p (smb_en + 1 , SB800_PIIX4_SMB_IDX );
305
307
smba_en_hi = inb_p (SB800_PIIX4_SMB_IDX + 1 );
306
- mutex_unlock (& piix4_mutex_sb800 );
308
+
309
+ release_region (SB800_PIIX4_SMB_IDX , 2 );
307
310
308
311
if (!smb_en ) {
309
312
smb_en_status = smba_en_lo & 0x10 ;
@@ -373,15 +376,20 @@ static int piix4_setup_sb800(struct pci_dev *PIIX4_dev,
373
376
break ;
374
377
}
375
378
} else {
376
- mutex_lock (& piix4_mutex_sb800 );
379
+ if (!request_muxed_region (SB800_PIIX4_SMB_IDX , 2 ,
380
+ "sb800_piix4_smb" )) {
381
+ release_region (piix4_smba , SMBIOSIZE );
382
+ return - EBUSY ;
383
+ }
384
+
377
385
outb_p (SB800_PIIX4_PORT_IDX_SEL , SB800_PIIX4_SMB_IDX );
378
386
port_sel = inb_p (SB800_PIIX4_SMB_IDX + 1 );
379
387
piix4_port_sel_sb800 = (port_sel & 0x01 ) ?
380
388
SB800_PIIX4_PORT_IDX_ALT :
381
389
SB800_PIIX4_PORT_IDX ;
382
390
piix4_port_mask_sb800 = SB800_PIIX4_PORT_IDX_MASK ;
383
391
piix4_port_shift_sb800 = SB800_PIIX4_PORT_IDX_SHIFT ;
384
- mutex_unlock ( & piix4_mutex_sb800 );
392
+ release_region ( SB800_PIIX4_SMB_IDX , 2 );
385
393
}
386
394
387
395
dev_info (& PIIX4_dev -> dev ,
@@ -679,7 +687,8 @@ static s32 piix4_access_sb800(struct i2c_adapter *adap, u16 addr,
679
687
u8 port ;
680
688
int retval ;
681
689
682
- mutex_lock (& piix4_mutex_sb800 );
690
+ if (!request_muxed_region (SB800_PIIX4_SMB_IDX , 2 , "sb800_piix4_smb" ))
691
+ return - EBUSY ;
683
692
684
693
/* Request the SMBUS semaphore, avoid conflicts with the IMC */
685
694
smbslvcnt = inb_p (SMBSLVCNT );
@@ -695,8 +704,8 @@ static s32 piix4_access_sb800(struct i2c_adapter *adap, u16 addr,
695
704
} while (-- retries );
696
705
/* SMBus is still owned by the IMC, we give up */
697
706
if (!retries ) {
698
- mutex_unlock ( & piix4_mutex_sb800 ) ;
699
- return - EBUSY ;
707
+ retval = - EBUSY ;
708
+ goto release ;
700
709
}
701
710
702
711
/*
@@ -753,8 +762,8 @@ static s32 piix4_access_sb800(struct i2c_adapter *adap, u16 addr,
753
762
if ((size == I2C_SMBUS_BLOCK_DATA ) && adapdata -> notify_imc )
754
763
piix4_imc_wakeup ();
755
764
756
- mutex_unlock ( & piix4_mutex_sb800 );
757
-
765
+ release :
766
+ release_region ( SB800_PIIX4_SMB_IDX , 2 );
758
767
return retval ;
759
768
}
760
769
@@ -899,13 +908,6 @@ static int piix4_probe(struct pci_dev *dev, const struct pci_device_id *id)
899
908
bool notify_imc = false;
900
909
is_sb800 = true;
901
910
902
- if (!request_region (SB800_PIIX4_SMB_IDX , 2 , "smba_idx" )) {
903
- dev_err (& dev -> dev ,
904
- "SMBus base address index region 0x%x already in use!\n" ,
905
- SB800_PIIX4_SMB_IDX );
906
- return - EBUSY ;
907
- }
908
-
909
911
if (dev -> vendor == PCI_VENDOR_ID_AMD &&
910
912
dev -> device == PCI_DEVICE_ID_AMD_KERNCZ_SMBUS ) {
911
913
u8 imc ;
@@ -922,20 +924,16 @@ static int piix4_probe(struct pci_dev *dev, const struct pci_device_id *id)
922
924
923
925
/* base address location etc changed in SB800 */
924
926
retval = piix4_setup_sb800 (dev , id , 0 );
925
- if (retval < 0 ) {
926
- release_region (SB800_PIIX4_SMB_IDX , 2 );
927
+ if (retval < 0 )
927
928
return retval ;
928
- }
929
929
930
930
/*
931
931
* Try to register multiplexed main SMBus adapter,
932
932
* give up if we can't
933
933
*/
934
934
retval = piix4_add_adapters_sb800 (dev , retval , notify_imc );
935
- if (retval < 0 ) {
936
- release_region (SB800_PIIX4_SMB_IDX , 2 );
935
+ if (retval < 0 )
937
936
return retval ;
938
- }
939
937
} else {
940
938
retval = piix4_setup (dev , id );
941
939
if (retval < 0 )
@@ -983,11 +981,8 @@ static void piix4_adap_remove(struct i2c_adapter *adap)
983
981
984
982
if (adapdata -> smba ) {
985
983
i2c_del_adapter (adap );
986
- if (adapdata -> port == (0 << piix4_port_shift_sb800 )) {
984
+ if (adapdata -> port == (0 << piix4_port_shift_sb800 ))
987
985
release_region (adapdata -> smba , SMBIOSIZE );
988
- if (adapdata -> sb800_main )
989
- release_region (SB800_PIIX4_SMB_IDX , 2 );
990
- }
991
986
kfree (adapdata );
992
987
kfree (adap );
993
988
}
0 commit comments