162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+
262306a36Sopenharmony_ci// PCI interface driver for Loongson SPI Support
362306a36Sopenharmony_ci// Copyright (C) 2023 Loongson Technology Corporation Limited
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/mod_devicetable.h>
662306a36Sopenharmony_ci#include <linux/pci.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include "spi-loongson.h"
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cistatic int loongson_spi_pci_register(struct pci_dev *pdev,
1162306a36Sopenharmony_ci			const struct pci_device_id *ent)
1262306a36Sopenharmony_ci{
1362306a36Sopenharmony_ci	int ret;
1462306a36Sopenharmony_ci	void __iomem *reg_base;
1562306a36Sopenharmony_ci	struct device *dev = &pdev->dev;
1662306a36Sopenharmony_ci	int pci_bar = 0;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci	ret = pcim_enable_device(pdev);
1962306a36Sopenharmony_ci	if (ret < 0)
2062306a36Sopenharmony_ci		return dev_err_probe(dev, ret, "cannot enable pci device\n");
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci	ret = pcim_iomap_regions(pdev, BIT(pci_bar), pci_name(pdev));
2362306a36Sopenharmony_ci	if (ret)
2462306a36Sopenharmony_ci		return dev_err_probe(dev, ret, "failed to request and remap memory\n");
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	reg_base = pcim_iomap_table(pdev)[pci_bar];
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci	ret = loongson_spi_init_controller(dev, reg_base);
2962306a36Sopenharmony_ci	if (ret)
3062306a36Sopenharmony_ci		return dev_err_probe(dev, ret, "failed to initialize controller\n");
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci	return 0;
3362306a36Sopenharmony_ci}
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_cistatic struct pci_device_id loongson_spi_devices[] = {
3662306a36Sopenharmony_ci	{ PCI_DEVICE(PCI_VENDOR_ID_LOONGSON, 0x7a0b) },
3762306a36Sopenharmony_ci	{ PCI_DEVICE(PCI_VENDOR_ID_LOONGSON, 0x7a1b) },
3862306a36Sopenharmony_ci	{ }
3962306a36Sopenharmony_ci};
4062306a36Sopenharmony_ciMODULE_DEVICE_TABLE(pci, loongson_spi_devices);
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistatic struct pci_driver loongson_spi_pci_driver = {
4362306a36Sopenharmony_ci	.name       = "loongson-spi-pci",
4462306a36Sopenharmony_ci	.id_table   = loongson_spi_devices,
4562306a36Sopenharmony_ci	.probe      = loongson_spi_pci_register,
4662306a36Sopenharmony_ci	.driver	= {
4762306a36Sopenharmony_ci		.bus = &pci_bus_type,
4862306a36Sopenharmony_ci		.pm = &loongson_spi_dev_pm_ops,
4962306a36Sopenharmony_ci	},
5062306a36Sopenharmony_ci};
5162306a36Sopenharmony_cimodule_pci_driver(loongson_spi_pci_driver);
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ciMODULE_DESCRIPTION("Loongson spi pci driver");
5462306a36Sopenharmony_ciMODULE_LICENSE("GPL");
5562306a36Sopenharmony_ciMODULE_IMPORT_NS(SPI_LOONGSON_CORE);
56