Skip to content

Commit bb47680

Browse files
committed
Merge branch 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
Pull i2c fixes from Wolfram Sang: "Here are two I2C driver regression fixes. piix4 gets a larger overhaul fixing the latest refactoring and also an older known issue as well. designware-pci gets a fix for a bad merge conflict resolution" * 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux: i2c: piix4: don't regress on bus names i2c: designware-pci: use IRQF_COND_SUSPEND flag i2c: piix4: Fully initialize SB800 before it is registered i2c: piix4: Fix SB800 locking
2 parents ad0b40f + 52795f6 commit bb47680

File tree

2 files changed

+23
-30
lines changed

2 files changed

+23
-30
lines changed

drivers/i2c/busses/i2c-designware-core.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -874,7 +874,8 @@ int i2c_dw_probe(struct dw_i2c_dev *dev)
874874
i2c_set_adapdata(adap, dev);
875875

876876
i2c_dw_disable_int(dev);
877-
r = devm_request_irq(dev->dev, dev->irq, i2c_dw_isr, IRQF_SHARED,
877+
r = devm_request_irq(dev->dev, dev->irq, i2c_dw_isr,
878+
IRQF_SHARED | IRQF_COND_SUSPEND,
878879
dev_name(dev->dev), dev);
879880
if (r) {
880881
dev_err(dev->dev, "failure requesting irq %i: %d\n",

drivers/i2c/busses/i2c-piix4.c

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -137,18 +137,18 @@ static const struct dmi_system_id piix4_dmi_ibm[] = {
137137
};
138138

139139
/* SB800 globals */
140+
static DEFINE_MUTEX(piix4_mutex_sb800);
140141
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"
142143
};
143-
static const char *piix4_aux_port_name_sb800 = "SDA1";
144+
static const char *piix4_aux_port_name_sb800 = " port 1";
144145

145146
struct i2c_piix4_adapdata {
146147
unsigned short smba;
147148

148149
/* SB800 */
149150
bool sb800_main;
150151
unsigned short port;
151-
struct mutex *mutex;
152152
};
153153

154154
static int piix4_setup(struct pci_dev *PIIX4_dev,
@@ -275,10 +275,12 @@ static int piix4_setup_sb800(struct pci_dev *PIIX4_dev,
275275
else
276276
smb_en = (aux) ? 0x28 : 0x2c;
277277

278+
mutex_lock(&piix4_mutex_sb800);
278279
outb_p(smb_en, SB800_PIIX4_SMB_IDX);
279280
smba_en_lo = inb_p(SB800_PIIX4_SMB_IDX + 1);
280281
outb_p(smb_en + 1, SB800_PIIX4_SMB_IDX);
281282
smba_en_hi = inb_p(SB800_PIIX4_SMB_IDX + 1);
283+
mutex_unlock(&piix4_mutex_sb800);
282284

283285
if (!smb_en) {
284286
smb_en_status = smba_en_lo & 0x10;
@@ -559,7 +561,7 @@ static s32 piix4_access_sb800(struct i2c_adapter *adap, u16 addr,
559561
u8 port;
560562
int retval;
561563

562-
mutex_lock(adapdata->mutex);
564+
mutex_lock(&piix4_mutex_sb800);
563565

564566
outb_p(SB800_PIIX4_PORT_IDX, SB800_PIIX4_SMB_IDX);
565567
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,
574576

575577
outb_p(smba_en_lo, SB800_PIIX4_SMB_IDX + 1);
576578

577-
mutex_unlock(adapdata->mutex);
579+
mutex_unlock(&piix4_mutex_sb800);
578580

579581
return retval;
580582
}
@@ -625,6 +627,7 @@ static struct i2c_adapter *piix4_main_adapters[PIIX4_MAX_ADAPTERS];
625627
static struct i2c_adapter *piix4_aux_adapter;
626628

627629
static int piix4_add_adapter(struct pci_dev *dev, unsigned short smba,
630+
bool sb800_main, unsigned short port,
628631
const char *name, struct i2c_adapter **padap)
629632
{
630633
struct i2c_adapter *adap;
@@ -639,7 +642,8 @@ static int piix4_add_adapter(struct pci_dev *dev, unsigned short smba,
639642

640643
adap->owner = THIS_MODULE;
641644
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;
643647

644648
adapdata = kzalloc(sizeof(*adapdata), GFP_KERNEL);
645649
if (adapdata == NULL) {
@@ -649,12 +653,14 @@ static int piix4_add_adapter(struct pci_dev *dev, unsigned short smba,
649653
}
650654

651655
adapdata->smba = smba;
656+
adapdata->sb800_main = sb800_main;
657+
adapdata->port = port;
652658

653659
/* set up the sysfs linkage to our parent device */
654660
adap->dev.parent = &dev->dev;
655661

656662
snprintf(adap->name, sizeof(adap->name),
657-
"SMBus PIIX4 adapter %s at %04x", name, smba);
663+
"SMBus PIIX4 adapter%s at %04x", name, smba);
658664

659665
i2c_set_adapdata(adap, adapdata);
660666

@@ -673,30 +679,16 @@ static int piix4_add_adapter(struct pci_dev *dev, unsigned short smba,
673679

674680
static int piix4_add_adapters_sb800(struct pci_dev *dev, unsigned short smba)
675681
{
676-
struct mutex *mutex;
677682
struct i2c_piix4_adapdata *adapdata;
678683
int port;
679684
int retval;
680685

681-
mutex = kzalloc(sizeof(*mutex), GFP_KERNEL);
682-
if (mutex == NULL)
683-
return -ENOMEM;
684-
685-
mutex_init(mutex);
686-
687686
for (port = 0; port < PIIX4_MAX_ADAPTERS; port++) {
688-
retval = piix4_add_adapter(dev, smba,
687+
retval = piix4_add_adapter(dev, smba, true, port,
689688
piix4_main_port_names_sb800[port],
690689
&piix4_main_adapters[port]);
691690
if (retval < 0)
692691
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;
700692
}
701693

702694
return retval;
@@ -714,19 +706,20 @@ static int piix4_add_adapters_sb800(struct pci_dev *dev, unsigned short smba)
714706
}
715707
}
716708

717-
kfree(mutex);
718-
719709
return retval;
720710
}
721711

722712
static int piix4_probe(struct pci_dev *dev, const struct pci_device_id *id)
723713
{
724714
int retval;
715+
bool is_sb800 = false;
725716

726717
if ((dev->vendor == PCI_VENDOR_ID_ATI &&
727718
dev->device == PCI_DEVICE_ID_ATI_SBX00_SMBUS &&
728719
dev->revision >= 0x40) ||
729720
dev->vendor == PCI_VENDOR_ID_AMD) {
721+
is_sb800 = true;
722+
730723
if (!request_region(SB800_PIIX4_SMB_IDX, 2, "smba_idx")) {
731724
dev_err(&dev->dev,
732725
"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)
756749
return retval;
757750

758751
/* 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, "",
760753
&piix4_main_adapters[0]);
761754
if (retval < 0)
762755
return retval;
@@ -783,7 +776,8 @@ static int piix4_probe(struct pci_dev *dev, const struct pci_device_id *id)
783776
if (retval > 0) {
784777
/* Try to add the aux adapter if it exists,
785778
* 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 : "",
787781
&piix4_aux_adapter);
788782
}
789783

@@ -798,10 +792,8 @@ static void piix4_adap_remove(struct i2c_adapter *adap)
798792
i2c_del_adapter(adap);
799793
if (adapdata->port == 0) {
800794
release_region(adapdata->smba, SMBIOSIZE);
801-
if (adapdata->sb800_main) {
802-
kfree(adapdata->mutex);
795+
if (adapdata->sb800_main)
803796
release_region(SB800_PIIX4_SMB_IDX, 2);
804-
}
805797
}
806798
kfree(adapdata);
807799
kfree(adap);

0 commit comments

Comments
 (0)