diff options
Diffstat (limited to 'drivers/fpga/xilinx-pr-decoupler.c')
| -rw-r--r-- | drivers/fpga/xilinx-pr-decoupler.c | 45 | 
1 files changed, 35 insertions, 10 deletions
| diff --git a/drivers/fpga/xilinx-pr-decoupler.c b/drivers/fpga/xilinx-pr-decoupler.c index 7d69af230567..ea2bde6e5bc4 100644 --- a/drivers/fpga/xilinx-pr-decoupler.c +++ b/drivers/fpga/xilinx-pr-decoupler.c @@ -1,7 +1,7 @@  // SPDX-License-Identifier: GPL-2.0-only  /*   * Copyright (c) 2017, National Instruments Corp. - * Copyright (c) 2017, Xilix Inc + * Copyright (c) 2017, Xilinx Inc   *   * FPGA Bridge Driver for the Xilinx LogiCORE Partial Reconfiguration   * Decoupler IP Core. @@ -18,7 +18,12 @@  #define CTRL_CMD_COUPLE		0  #define CTRL_OFFSET		0 +struct xlnx_config_data { +	const char *name; +}; +  struct xlnx_pr_decoupler_data { +	const struct xlnx_config_data *ipconfig;  	void __iomem *io_base;  	struct clk *clk;  }; @@ -76,15 +81,28 @@ static const struct fpga_bridge_ops xlnx_pr_decoupler_br_ops = {  	.enable_show = xlnx_pr_decoupler_enable_show,  }; +static const struct xlnx_config_data decoupler_config = { +	.name = "Xilinx PR Decoupler", +}; + +static const struct xlnx_config_data shutdown_config = { +	.name = "Xilinx DFX AXI Shutdown Manager", +}; +  static const struct of_device_id xlnx_pr_decoupler_of_match[] = { -	{ .compatible = "xlnx,pr-decoupler-1.00", }, -	{ .compatible = "xlnx,pr-decoupler", }, +	{ .compatible = "xlnx,pr-decoupler-1.00", .data = &decoupler_config }, +	{ .compatible = "xlnx,pr-decoupler", .data = &decoupler_config }, +	{ .compatible = "xlnx,dfx-axi-shutdown-manager-1.00", +					.data = &shutdown_config }, +	{ .compatible = "xlnx,dfx-axi-shutdown-manager", +					.data = &shutdown_config },  	{},  };  MODULE_DEVICE_TABLE(of, xlnx_pr_decoupler_of_match);  static int xlnx_pr_decoupler_probe(struct platform_device *pdev)  { +	struct device_node *np = pdev->dev.of_node;  	struct xlnx_pr_decoupler_data *priv;  	struct fpga_bridge *br;  	int err; @@ -94,17 +112,23 @@ static int xlnx_pr_decoupler_probe(struct platform_device *pdev)  	if (!priv)  		return -ENOMEM; +	if (np) { +		const struct of_device_id *match; + +		match = of_match_node(xlnx_pr_decoupler_of_match, np); +		if (match && match->data) +			priv->ipconfig = match->data; +	} +  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);  	priv->io_base = devm_ioremap_resource(&pdev->dev, res);  	if (IS_ERR(priv->io_base))  		return PTR_ERR(priv->io_base);  	priv->clk = devm_clk_get(&pdev->dev, "aclk"); -	if (IS_ERR(priv->clk)) { -		if (PTR_ERR(priv->clk) != -EPROBE_DEFER) -			dev_err(&pdev->dev, "input clock not found\n"); -		return PTR_ERR(priv->clk); -	} +	if (IS_ERR(priv->clk)) +		return dev_err_probe(&pdev->dev, PTR_ERR(priv->clk), +				     "input clock not found\n");  	err = clk_prepare_enable(priv->clk);  	if (err) { @@ -114,7 +138,7 @@ static int xlnx_pr_decoupler_probe(struct platform_device *pdev)  	clk_disable(priv->clk); -	br = devm_fpga_bridge_create(&pdev->dev, "Xilinx PR Decoupler", +	br = devm_fpga_bridge_create(&pdev->dev, priv->ipconfig->name,  				     &xlnx_pr_decoupler_br_ops, priv);  	if (!br) {  		err = -ENOMEM; @@ -125,7 +149,8 @@ static int xlnx_pr_decoupler_probe(struct platform_device *pdev)  	err = fpga_bridge_register(br);  	if (err) { -		dev_err(&pdev->dev, "unable to register Xilinx PR Decoupler"); +		dev_err(&pdev->dev, "unable to register %s", +			priv->ipconfig->name);  		goto err_clk;  	} | 
