brintos

brintos / linux-shallow public Read only

0
0
Text · 2.4 KiB · e7ab699 Raw
106 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * Synopsys DesignWare Multimedia Card PCI Interface driver4 *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/pm_runtime.h>14#include <linux/slab.h>15#include <linux/mmc/host.h>16#include <linux/mmc/mmc.h>17#include "dw_mmc.h"18 19#define PCI_BAR_NO 220#define SYNOPSYS_DW_MCI_VENDOR_ID 0x70021#define SYNOPSYS_DW_MCI_DEVICE_ID 0x110722/* Defining the Capabilities */23#define DW_MCI_CAPABILITIES (MMC_CAP_4_BIT_DATA | MMC_CAP_MMC_HIGHSPEED |\24				MMC_CAP_SD_HIGHSPEED | MMC_CAP_8_BIT_DATA |\25				MMC_CAP_SDIO_IRQ)26 27static struct dw_mci_board pci_board_data = {28	.caps				= DW_MCI_CAPABILITIES,29	.bus_hz				= 33 * 1000 * 1000,30	.detect_delay_ms		= 200,31	.fifo_depth			= 32,32};33 34static int dw_mci_pci_probe(struct pci_dev *pdev,35			    const struct pci_device_id *entries)36{37	struct dw_mci *host;38	int ret;39 40	ret = pcim_enable_device(pdev);41	if (ret)42		return ret;43 44	host = devm_kzalloc(&pdev->dev, sizeof(struct dw_mci), GFP_KERNEL);45	if (!host)46		return -ENOMEM;47 48	host->irq = pdev->irq;49	host->irq_flags = IRQF_SHARED;50	host->dev = &pdev->dev;51	host->pdata = &pci_board_data;52 53	ret = pcim_iomap_regions(pdev, 1 << PCI_BAR_NO, pci_name(pdev));54	if (ret)55		return ret;56 57	host->regs = pcim_iomap_table(pdev)[PCI_BAR_NO];58 59	pci_set_master(pdev);60 61	ret = dw_mci_probe(host);62	if (ret)63		return ret;64 65	pci_set_drvdata(pdev, host);66 67	return 0;68}69 70static void dw_mci_pci_remove(struct pci_dev *pdev)71{72	struct dw_mci *host = pci_get_drvdata(pdev);73 74	dw_mci_remove(host);75}76 77static const struct dev_pm_ops dw_mci_pci_dev_pm_ops = {78	SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,79				pm_runtime_force_resume)80	SET_RUNTIME_PM_OPS(dw_mci_runtime_suspend,81			   dw_mci_runtime_resume,82			   NULL)83};84 85static const struct pci_device_id dw_mci_pci_id[] = {86	{ PCI_DEVICE(SYNOPSYS_DW_MCI_VENDOR_ID, SYNOPSYS_DW_MCI_DEVICE_ID) },87	{}88};89MODULE_DEVICE_TABLE(pci, dw_mci_pci_id);90 91static struct pci_driver dw_mci_pci_driver = {92	.name		= "dw_mmc_pci",93	.id_table	= dw_mci_pci_id,94	.probe		= dw_mci_pci_probe,95	.remove		= dw_mci_pci_remove,96	.driver		=	{97		.pm =   &dw_mci_pci_dev_pm_ops,98	},99};100 101module_pci_driver(dw_mci_pci_driver);102 103MODULE_DESCRIPTION("DW Multimedia Card PCI Interface driver");104MODULE_AUTHOR("Shashidhar Hiremath <shashidharh@vayavyalabs.com>");105MODULE_LICENSE("GPL v2");106