@@ -137,18 +137,18 @@ static const struct dmi_system_id piix4_dmi_ibm[] = {
137
137
};
138
138
139
139
/* SB800 globals */
140
+ static DEFINE_MUTEX (piix4_mutex_sb800 );
140
141
static const char * piix4_main_port_names_sb800 [PIIX4_MAX_ADAPTERS ] = {
141
- "SDA0 " , "SDA2 " , "SDA3 " , "SDA4 "
142
+ " port 0 " , " port 2 " , " port 3 " , " port 4 "
142
143
};
143
- static const char * piix4_aux_port_name_sb800 = "SDA1 " ;
144
+ static const char * piix4_aux_port_name_sb800 = " port 1 " ;
144
145
145
146
struct i2c_piix4_adapdata {
146
147
unsigned short smba ;
147
148
148
149
/* SB800 */
149
150
bool sb800_main ;
150
151
unsigned short port ;
151
- struct mutex * mutex ;
152
152
};
153
153
154
154
static int piix4_setup (struct pci_dev * PIIX4_dev ,
@@ -275,10 +275,12 @@ static int piix4_setup_sb800(struct pci_dev *PIIX4_dev,
275
275
else
276
276
smb_en = (aux ) ? 0x28 : 0x2c ;
277
277
278
+ mutex_lock (& piix4_mutex_sb800 );
278
279
outb_p (smb_en , SB800_PIIX4_SMB_IDX );
279
280
smba_en_lo = inb_p (SB800_PIIX4_SMB_IDX + 1 );
280
281
outb_p (smb_en + 1 , SB800_PIIX4_SMB_IDX );
281
282
smba_en_hi = inb_p (SB800_PIIX4_SMB_IDX + 1 );
283
+ mutex_unlock (& piix4_mutex_sb800 );
282
284
283
285
if (!smb_en ) {
284
286
smb_en_status = smba_en_lo & 0x10 ;
@@ -559,7 +561,7 @@ static s32 piix4_access_sb800(struct i2c_adapter *adap, u16 addr,
559
561
u8 port ;
560
562
int retval ;
561
563
562
- mutex_lock (adapdata -> mutex );
564
+ mutex_lock (& piix4_mutex_sb800 );
563
565
564
566
outb_p (SB800_PIIX4_PORT_IDX , SB800_PIIX4_SMB_IDX );
565
567
smba_en_lo = inb_p (SB800_PIIX4_SMB_IDX + 1 );
@@ -574,7 +576,7 @@ static s32 piix4_access_sb800(struct i2c_adapter *adap, u16 addr,
574
576
575
577
outb_p (smba_en_lo , SB800_PIIX4_SMB_IDX + 1 );
576
578
577
- mutex_unlock (adapdata -> mutex );
579
+ mutex_unlock (& piix4_mutex_sb800 );
578
580
579
581
return retval ;
580
582
}
@@ -625,6 +627,7 @@ static struct i2c_adapter *piix4_main_adapters[PIIX4_MAX_ADAPTERS];
625
627
static struct i2c_adapter * piix4_aux_adapter ;
626
628
627
629
static int piix4_add_adapter (struct pci_dev * dev , unsigned short smba ,
630
+ bool sb800_main , unsigned short port ,
628
631
const char * name , struct i2c_adapter * * padap )
629
632
{
630
633
struct i2c_adapter * adap ;
@@ -639,7 +642,8 @@ static int piix4_add_adapter(struct pci_dev *dev, unsigned short smba,
639
642
640
643
adap -> owner = THIS_MODULE ;
641
644
adap -> class = I2C_CLASS_HWMON | I2C_CLASS_SPD ;
642
- adap -> algo = & smbus_algorithm ;
645
+ adap -> algo = sb800_main ? & piix4_smbus_algorithm_sb800
646
+ : & smbus_algorithm ;
643
647
644
648
adapdata = kzalloc (sizeof (* adapdata ), GFP_KERNEL );
645
649
if (adapdata == NULL ) {
@@ -649,12 +653,14 @@ static int piix4_add_adapter(struct pci_dev *dev, unsigned short smba,
649
653
}
650
654
651
655
adapdata -> smba = smba ;
656
+ adapdata -> sb800_main = sb800_main ;
657
+ adapdata -> port = port ;
652
658
653
659
/* set up the sysfs linkage to our parent device */
654
660
adap -> dev .parent = & dev -> dev ;
655
661
656
662
snprintf (adap -> name , sizeof (adap -> name ),
657
- "SMBus PIIX4 adapter %s at %04x" , name , smba );
663
+ "SMBus PIIX4 adapter%s at %04x" , name , smba );
658
664
659
665
i2c_set_adapdata (adap , adapdata );
660
666
@@ -673,30 +679,16 @@ static int piix4_add_adapter(struct pci_dev *dev, unsigned short smba,
673
679
674
680
static int piix4_add_adapters_sb800 (struct pci_dev * dev , unsigned short smba )
675
681
{
676
- struct mutex * mutex ;
677
682
struct i2c_piix4_adapdata * adapdata ;
678
683
int port ;
679
684
int retval ;
680
685
681
- mutex = kzalloc (sizeof (* mutex ), GFP_KERNEL );
682
- if (mutex == NULL )
683
- return - ENOMEM ;
684
-
685
- mutex_init (mutex );
686
-
687
686
for (port = 0 ; port < PIIX4_MAX_ADAPTERS ; port ++ ) {
688
- retval = piix4_add_adapter (dev , smba ,
687
+ retval = piix4_add_adapter (dev , smba , true, port ,
689
688
piix4_main_port_names_sb800 [port ],
690
689
& piix4_main_adapters [port ]);
691
690
if (retval < 0 )
692
691
goto error ;
693
-
694
- piix4_main_adapters [port ]-> algo = & piix4_smbus_algorithm_sb800 ;
695
-
696
- adapdata = i2c_get_adapdata (piix4_main_adapters [port ]);
697
- adapdata -> sb800_main = true;
698
- adapdata -> port = port ;
699
- adapdata -> mutex = mutex ;
700
692
}
701
693
702
694
return retval ;
@@ -714,19 +706,20 @@ static int piix4_add_adapters_sb800(struct pci_dev *dev, unsigned short smba)
714
706
}
715
707
}
716
708
717
- kfree (mutex );
718
-
719
709
return retval ;
720
710
}
721
711
722
712
static int piix4_probe (struct pci_dev * dev , const struct pci_device_id * id )
723
713
{
724
714
int retval ;
715
+ bool is_sb800 = false;
725
716
726
717
if ((dev -> vendor == PCI_VENDOR_ID_ATI &&
727
718
dev -> device == PCI_DEVICE_ID_ATI_SBX00_SMBUS &&
728
719
dev -> revision >= 0x40 ) ||
729
720
dev -> vendor == PCI_VENDOR_ID_AMD ) {
721
+ is_sb800 = true;
722
+
730
723
if (!request_region (SB800_PIIX4_SMB_IDX , 2 , "smba_idx" )) {
731
724
dev_err (& dev -> dev ,
732
725
"SMBus base address index region 0x%x already in use!\n" ,
@@ -756,7 +749,7 @@ static int piix4_probe(struct pci_dev *dev, const struct pci_device_id *id)
756
749
return retval ;
757
750
758
751
/* Try to register main SMBus adapter, give up if we can't */
759
- retval = piix4_add_adapter (dev , retval , "main " ,
752
+ retval = piix4_add_adapter (dev , retval , false, 0 , " " ,
760
753
& piix4_main_adapters [0 ]);
761
754
if (retval < 0 )
762
755
return retval ;
@@ -783,7 +776,8 @@ static int piix4_probe(struct pci_dev *dev, const struct pci_device_id *id)
783
776
if (retval > 0 ) {
784
777
/* Try to add the aux adapter if it exists,
785
778
* piix4_add_adapter will clean up if this fails */
786
- piix4_add_adapter (dev , retval , piix4_aux_port_name_sb800 ,
779
+ piix4_add_adapter (dev , retval , false, 0 ,
780
+ is_sb800 ? piix4_aux_port_name_sb800 : "" ,
787
781
& piix4_aux_adapter );
788
782
}
789
783
@@ -798,10 +792,8 @@ static void piix4_adap_remove(struct i2c_adapter *adap)
798
792
i2c_del_adapter (adap );
799
793
if (adapdata -> port == 0 ) {
800
794
release_region (adapdata -> smba , SMBIOSIZE );
801
- if (adapdata -> sb800_main ) {
802
- kfree (adapdata -> mutex );
795
+ if (adapdata -> sb800_main )
803
796
release_region (SB800_PIIX4_SMB_IDX , 2 );
804
- }
805
797
}
806
798
kfree (adapdata );
807
799
kfree (adap );
0 commit comments