diff options
Diffstat (limited to 'drivers/mfd/rtsx_pcr.c')
| -rw-r--r-- | drivers/mfd/rtsx_pcr.c | 22 | 
1 files changed, 15 insertions, 7 deletions
diff --git a/drivers/mfd/rtsx_pcr.c b/drivers/mfd/rtsx_pcr.c index e6ae7720f9e..1d15735f9ef 100644 --- a/drivers/mfd/rtsx_pcr.c +++ b/drivers/mfd/rtsx_pcr.c @@ -50,13 +50,14 @@ static struct mfd_cell rtsx_pcr_cells[] = {  	},  }; -static DEFINE_PCI_DEVICE_TABLE(rtsx_pci_ids) = { +static const struct pci_device_id rtsx_pci_ids[] = {  	{ PCI_DEVICE(0x10EC, 0x5209), PCI_CLASS_OTHERS << 16, 0xFF0000 },  	{ PCI_DEVICE(0x10EC, 0x5229), PCI_CLASS_OTHERS << 16, 0xFF0000 },  	{ PCI_DEVICE(0x10EC, 0x5289), PCI_CLASS_OTHERS << 16, 0xFF0000 },  	{ PCI_DEVICE(0x10EC, 0x5227), PCI_CLASS_OTHERS << 16, 0xFF0000 },  	{ PCI_DEVICE(0x10EC, 0x5249), PCI_CLASS_OTHERS << 16, 0xFF0000 },  	{ PCI_DEVICE(0x10EC, 0x5287), PCI_CLASS_OTHERS << 16, 0xFF0000 }, +	{ PCI_DEVICE(0x10EC, 0x5286), PCI_CLASS_OTHERS << 16, 0xFF0000 },  	{ 0, }  }; @@ -1061,6 +1062,10 @@ static int rtsx_pci_init_chip(struct rtsx_pcr *pcr)  	case 0x5287:  		rtl8411b_init_params(pcr);  		break; + +	case 0x5286: +		rtl8402_init_params(pcr); +		break;  	}  	dev_dbg(&(pcr->pci->dev), "PID: 0x%04x, IC version: 0x%02x\n", @@ -1149,7 +1154,7 @@ static int rtsx_pci_probe(struct pci_dev *pcidev,  	pcr->remap_addr = ioremap_nocache(base, len);  	if (!pcr->remap_addr) {  		ret = -ENOMEM; -		goto free_host; +		goto free_handle;  	}  	pcr->rtsx_resv_buf = dma_alloc_coherent(&(pcidev->dev), @@ -1209,8 +1214,6 @@ disable_msi:  			pcr->rtsx_resv_buf, pcr->rtsx_resv_buf_addr);  unmap:  	iounmap(pcr->remap_addr); -free_host: -	dev_set_drvdata(&pcidev->dev, NULL);  free_handle:  	kfree(handle);  free_pcr: @@ -1230,8 +1233,14 @@ static void rtsx_pci_remove(struct pci_dev *pcidev)  	pcr->remove_pci = true; -	cancel_delayed_work(&pcr->carddet_work); -	cancel_delayed_work(&pcr->idle_work); +	/* Disable interrupts at the pcr level */ +	spin_lock_irq(&pcr->lock); +	rtsx_pci_writel(pcr, RTSX_BIER, 0); +	pcr->bier = 0; +	spin_unlock_irq(&pcr->lock); + +	cancel_delayed_work_sync(&pcr->carddet_work); +	cancel_delayed_work_sync(&pcr->idle_work);  	mfd_remove_devices(&pcidev->dev); @@ -1242,7 +1251,6 @@ static void rtsx_pci_remove(struct pci_dev *pcidev)  		pci_disable_msi(pcr->pci);  	iounmap(pcr->remap_addr); -	dev_set_drvdata(&pcidev->dev, NULL);  	pci_release_regions(pcidev);  	pci_disable_device(pcidev);  | 
