162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * PCIe host controller driver for Mobiveil PCIe Host controller
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (c) 2018 Mobiveil Inc.
662306a36Sopenharmony_ci * Copyright 2019 NXP
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * Author: Subrahmanya Lingappa <l.subrahmanya@mobiveil.co.in>
962306a36Sopenharmony_ci *	   Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/init.h>
1362306a36Sopenharmony_ci#include <linux/kernel.h>
1462306a36Sopenharmony_ci#include <linux/module.h>
1562306a36Sopenharmony_ci#include <linux/of_pci.h>
1662306a36Sopenharmony_ci#include <linux/pci.h>
1762306a36Sopenharmony_ci#include <linux/platform_device.h>
1862306a36Sopenharmony_ci#include <linux/slab.h>
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include "pcie-mobiveil.h"
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistatic int mobiveil_pcie_probe(struct platform_device *pdev)
2362306a36Sopenharmony_ci{
2462306a36Sopenharmony_ci	struct mobiveil_pcie *pcie;
2562306a36Sopenharmony_ci	struct pci_host_bridge *bridge;
2662306a36Sopenharmony_ci	struct device *dev = &pdev->dev;
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci	/* allocate the PCIe port */
2962306a36Sopenharmony_ci	bridge = devm_pci_alloc_host_bridge(dev, sizeof(*pcie));
3062306a36Sopenharmony_ci	if (!bridge)
3162306a36Sopenharmony_ci		return -ENOMEM;
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci	pcie = pci_host_bridge_priv(bridge);
3462306a36Sopenharmony_ci	pcie->rp.bridge = bridge;
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	pcie->pdev = pdev;
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	return mobiveil_pcie_host_probe(pcie);
3962306a36Sopenharmony_ci}
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cistatic const struct of_device_id mobiveil_pcie_of_match[] = {
4262306a36Sopenharmony_ci	{.compatible = "mbvl,gpex40-pcie",},
4362306a36Sopenharmony_ci	{},
4462306a36Sopenharmony_ci};
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, mobiveil_pcie_of_match);
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cistatic struct platform_driver mobiveil_pcie_driver = {
4962306a36Sopenharmony_ci	.probe = mobiveil_pcie_probe,
5062306a36Sopenharmony_ci	.driver = {
5162306a36Sopenharmony_ci		.name = "mobiveil-pcie",
5262306a36Sopenharmony_ci		.of_match_table = mobiveil_pcie_of_match,
5362306a36Sopenharmony_ci		.suppress_bind_attrs = true,
5462306a36Sopenharmony_ci	},
5562306a36Sopenharmony_ci};
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cibuiltin_platform_driver(mobiveil_pcie_driver);
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ciMODULE_DESCRIPTION("Mobiveil PCIe host controller driver");
6062306a36Sopenharmony_ciMODULE_AUTHOR("Subrahmanya Lingappa <l.subrahmanya@mobiveil.co.in>");
61