Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/fpga/dfl-fme-br.c
26381 views
1
// SPDX-License-Identifier: GPL-2.0
2
/*
3
* FPGA Bridge Driver for FPGA Management Engine (FME)
4
*
5
* Copyright (C) 2017-2018 Intel Corporation, Inc.
6
*
7
* Authors:
8
* Wu Hao <[email protected]>
9
* Joseph Grecco <[email protected]>
10
* Enno Luebbers <[email protected]>
11
* Tim Whisonant <[email protected]>
12
* Ananda Ravuri <[email protected]>
13
* Henry Mitchel <[email protected]>
14
*/
15
16
#include <linux/module.h>
17
#include <linux/fpga/fpga-bridge.h>
18
19
#include "dfl.h"
20
#include "dfl-fme-pr.h"
21
22
struct fme_br_priv {
23
struct dfl_fme_br_pdata *pdata;
24
struct dfl_fpga_port_ops *port_ops;
25
struct dfl_feature_dev_data *port_fdata;
26
};
27
28
static int fme_bridge_enable_set(struct fpga_bridge *bridge, bool enable)
29
{
30
struct fme_br_priv *priv = bridge->priv;
31
struct dfl_feature_dev_data *port_fdata;
32
struct dfl_fpga_port_ops *ops;
33
34
if (!priv->port_fdata) {
35
port_fdata = dfl_fpga_cdev_find_port_data(priv->pdata->cdev,
36
&priv->pdata->port_id,
37
dfl_fpga_check_port_id);
38
if (!port_fdata)
39
return -ENODEV;
40
41
priv->port_fdata = port_fdata;
42
}
43
44
if (priv->port_fdata && !priv->port_ops) {
45
ops = dfl_fpga_port_ops_get(priv->port_fdata);
46
if (!ops || !ops->enable_set)
47
return -ENOENT;
48
49
priv->port_ops = ops;
50
}
51
52
return priv->port_ops->enable_set(priv->port_fdata, enable);
53
}
54
55
static const struct fpga_bridge_ops fme_bridge_ops = {
56
.enable_set = fme_bridge_enable_set,
57
};
58
59
static int fme_br_probe(struct platform_device *pdev)
60
{
61
struct device *dev = &pdev->dev;
62
struct fme_br_priv *priv;
63
struct fpga_bridge *br;
64
65
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
66
if (!priv)
67
return -ENOMEM;
68
69
priv->pdata = dev_get_platdata(dev);
70
71
br = fpga_bridge_register(dev, "DFL FPGA FME Bridge",
72
&fme_bridge_ops, priv);
73
if (IS_ERR(br))
74
return PTR_ERR(br);
75
76
platform_set_drvdata(pdev, br);
77
78
return 0;
79
}
80
81
static void fme_br_remove(struct platform_device *pdev)
82
{
83
struct fpga_bridge *br = platform_get_drvdata(pdev);
84
struct fme_br_priv *priv = br->priv;
85
86
fpga_bridge_unregister(br);
87
88
if (priv->port_ops)
89
dfl_fpga_port_ops_put(priv->port_ops);
90
}
91
92
static struct platform_driver fme_br_driver = {
93
.driver = {
94
.name = DFL_FPGA_FME_BRIDGE,
95
},
96
.probe = fme_br_probe,
97
.remove = fme_br_remove,
98
};
99
100
module_platform_driver(fme_br_driver);
101
102
MODULE_DESCRIPTION("FPGA Bridge for DFL FPGA Management Engine");
103
MODULE_AUTHOR("Intel Corporation");
104
MODULE_LICENSE("GPL v2");
105
MODULE_ALIAS("platform:dfl-fme-bridge");
106
107