1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Synopsys DesignWare Multimedia Card PCI Interface driver 4 * 5 * Copyright (C) 2012 Vayavya Labs Pvt. Ltd. 6 */ 7 8 #include <linux/interrupt.h> 9 #include <linux/module.h> 10 #include <linux/io.h> 11 #include <linux/irq.h> 12 #include <linux/pci.h> 13 #include <linux/pci-epf.h> 14 #include <linux/pm_runtime.h> 15 #include <linux/slab.h> 16 #include <linux/mmc/host.h> 17 #include <linux/mmc/mmc.h> 18 #include "dw_mmc.h" 19 #include "dw_mmc-pltfm.h" 20 21 #define SYNOPSYS_DW_MCI_VENDOR_ID 0x700 22 #define SYNOPSYS_DW_MCI_DEVICE_ID 0x1107 23 /* Defining the Capabilities */ 24 #define DW_MCI_CAPABILITIES (MMC_CAP_4_BIT_DATA | MMC_CAP_MMC_HIGHSPEED |\ 25 MMC_CAP_SD_HIGHSPEED | MMC_CAP_8_BIT_DATA |\ 26 MMC_CAP_SDIO_IRQ) 27 28 static const struct dw_mci_drv_data pci_drv_data = { 29 .common_caps = DW_MCI_CAPABILITIES, 30 }; 31 32 static int dw_mci_pci_probe(struct pci_dev *pdev, 33 const struct pci_device_id *entries) 34 { 35 struct dw_mci *host; 36 int ret; 37 38 ret = pcim_enable_device(pdev); 39 if (ret) 40 return ret; 41 42 host = dw_mci_alloc_host(&pdev->dev); 43 if (IS_ERR(host)) 44 return PTR_ERR(host); 45 46 host->irq = pdev->irq; 47 host->irq_flags = IRQF_SHARED; 48 host->fifo_depth = 32; 49 host->detect_delay_ms = 200; 50 host->bus_hz = 33 * 1000 * 1000; 51 host->drv_data = &pci_drv_data; 52 53 host->regs = pcim_iomap_region(pdev, BAR_2, pci_name(pdev)); 54 if (IS_ERR(host->regs)) 55 return PTR_ERR(host->regs); 56 57 pci_set_master(pdev); 58 59 ret = dw_mci_probe(host); 60 if (ret) 61 return ret; 62 63 pci_set_drvdata(pdev, host); 64 65 return 0; 66 } 67 68 static void dw_mci_pci_remove(struct pci_dev *pdev) 69 { 70 struct dw_mci *host = pci_get_drvdata(pdev); 71 72 dw_mci_remove(host); 73 } 74 75 static const struct pci_device_id dw_mci_pci_id[] = { 76 { PCI_DEVICE(SYNOPSYS_DW_MCI_VENDOR_ID, SYNOPSYS_DW_MCI_DEVICE_ID) }, 77 {} 78 }; 79 MODULE_DEVICE_TABLE(pci, dw_mci_pci_id); 80 81 static struct pci_driver dw_mci_pci_driver = { 82 .name = "dw_mmc_pci", 83 .id_table = dw_mci_pci_id, 84 .probe = dw_mci_pci_probe, 85 .remove = dw_mci_pci_remove, 86 .driver = { 87 .pm = pm_ptr(&dw_mci_pmops), 88 }, 89 }; 90 91 module_pci_driver(dw_mci_pci_driver); 92 93 MODULE_DESCRIPTION("DW Multimedia Card PCI Interface driver"); 94 MODULE_AUTHOR("Shashidhar Hiremath <shashidharh@vayavyalabs.com>"); 95 MODULE_LICENSE("GPL v2"); 96