代码拉取完成,页面将自动刷新
// SPDX-License-Identifier: GPL-2.0
/*
* Phytium SPI core controller PCI driver.
*
* Copyright (c) 2019-2024 Phytium Technology Co., Ltd.
*/
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/err.h>
#include <linux/gpio.h>
#include <linux/highmem.h>
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/spi/spi.h>
#include <linux/scatterlist.h>
#include <linux/module.h>
#include <linux/pci.h>
#include <linux/property.h>
#include "spi-phytium.h"
#define DRIVER_NAME "phytium_spi_pci"
#define DRIVER_VERSION "1.0.0"
static int phytium_spi_pci_probe(struct pci_dev *pdev,
const struct pci_device_id *id)
{
struct phytium_spi *fts;
int pci_bar = 0;
int ret;
fts = devm_kzalloc(&pdev->dev, sizeof(struct phytium_spi),
GFP_KERNEL);
if (!fts)
return -ENOMEM;
ret = pcim_enable_device(pdev);
if (ret)
return ret;
ret = pcim_iomap_regions(pdev, 1 << pci_bar, pci_name(pdev));
if (ret) {
dev_err(&pdev->dev, "pci iomap failed?\n");
return ret;
}
fts->regs = pcim_iomap_table(pdev)[pci_bar];
if (IS_ERR(fts->regs)) {
dev_err(&pdev->dev, "SPI region map failed\n");
return PTR_ERR(fts->regs);
}
fts->irq = pdev->irq;
if (fts->irq < 0) {
dev_err(&pdev->dev, "no irq resource?\n");
return fts->irq; /* -ENXIO */
}
fts->bus_num = -1;
fts->max_freq = 48000000;
fts->num_cs = 4;
fts->global_cs = 1;
ret = phytium_spi_add_host(&pdev->dev, fts);
if (ret)
return ret;
pci_set_drvdata(pdev, fts);
return 0;
}
static void phytium_spi_pci_remove(struct pci_dev *pdev)
{
struct phytium_spi *fts = pci_get_drvdata(pdev);
phytium_spi_remove_host(fts);
}
#ifdef CONFIG_PM_SLEEP
static int spi_suspend(struct device *dev)
{
struct phytium_spi *fts = dev_get_drvdata(dev);
return phytium_spi_suspend_host(fts);
}
static int spi_resume(struct device *dev)
{
struct phytium_spi *fts = dev_get_drvdata(dev);
return phytium_spi_resume_host(fts);
}
#endif
static SIMPLE_DEV_PM_OPS(phytium_spi_pm_ops, spi_suspend, spi_resume);
static const struct pci_device_id phytium_device_pci_tbl[] = {
{ PCI_VDEVICE(PHYTIUM, 0xdc2c) },
{},
};
MODULE_DEVICE_TABLE(pci, phytium_device_pci_tbl);
static struct pci_driver phytium_spi_pci_driver = {
.name = DRIVER_NAME,
.id_table = phytium_device_pci_tbl,
.probe = phytium_spi_pci_probe,
.remove = phytium_spi_pci_remove,
.driver = {
.pm = &phytium_spi_pm_ops,
}
};
module_pci_driver(phytium_spi_pci_driver);
MODULE_AUTHOR("Yiqun Zhang <zhangyiqun@phytium.com.cn>");
MODULE_DESCRIPTION("PCI Driver for Phytium SPI controller core");
MODULE_LICENSE("GPL v2");
MODULE_VERSION(DRIVER_VERSION);
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。