94 lines · 2.5 KB · C
RawDownload
// SPDX-License-Identifier: GPL-2.0-only/* * Xilinx Spartan6 and 7 Series SelectMAP interface driver * * (C) 2024 Charles Perry <charles.perry@savoirfairelinux.com> * * Manage Xilinx FPGA firmware loaded over the SelectMAP configuration * interface. */ #include "xilinx-core.h" #include <linux/gpio/consumer.h>#include <linux/io.h>#include <linux/module.h>#include <linux/of.h>#include <linux/platform_device.h> struct xilinx_selectmap_conf {	struct xilinx_fpga_core core;	void __iomem *base;}; #define to_xilinx_selectmap_conf(obj) \	container_of(obj, struct xilinx_selectmap_conf, core) static int xilinx_selectmap_write(struct xilinx_fpga_core *core,				  const char *buf, size_t count){	struct xilinx_selectmap_conf *conf = to_xilinx_selectmap_conf(core);	size_t i; 	for (i = 0; i < count; ++i)		writeb(buf[i], conf->base); 	return 0;} static int xilinx_selectmap_probe(struct platform_device *pdev){	struct xilinx_selectmap_conf *conf;	struct gpio_desc *gpio;	void __iomem *base; 	conf = devm_kzalloc(&pdev->dev, sizeof(*conf), GFP_KERNEL);	if (!conf)		return -ENOMEM; 	conf->core.dev = &pdev->dev;	conf->core.write = xilinx_selectmap_write; 	base = devm_platform_get_and_ioremap_resource(pdev, 0, NULL);	if (IS_ERR(base))		return dev_err_probe(&pdev->dev, PTR_ERR(base),				     "ioremap error\n");	conf->base = base; 	/* CSI_B is active low */	gpio = devm_gpiod_get_optional(&pdev->dev, "csi", GPIOD_OUT_HIGH);	if (IS_ERR(gpio))		return dev_err_probe(&pdev->dev, PTR_ERR(gpio),				     "Failed to get CSI_B gpio\n"); 	/* RDWR_B is active low */	gpio = devm_gpiod_get_optional(&pdev->dev, "rdwr", GPIOD_OUT_HIGH);	if (IS_ERR(gpio))		return dev_err_probe(&pdev->dev, PTR_ERR(gpio),				     "Failed to get RDWR_B gpio\n"); 	return xilinx_core_probe(&conf->core);} static const struct of_device_id xlnx_selectmap_of_match[] = {	{ .compatible = "xlnx,fpga-xc7s-selectmap", }, // Spartan-7	{ .compatible = "xlnx,fpga-xc7a-selectmap", }, // Artix-7	{ .compatible = "xlnx,fpga-xc7k-selectmap", }, // Kintex-7	{ .compatible = "xlnx,fpga-xc7v-selectmap", }, // Virtex-7	{},};MODULE_DEVICE_TABLE(of, xlnx_selectmap_of_match); static struct platform_driver xilinx_selectmap_driver = {	.driver = {		.name = "xilinx-selectmap",		.of_match_table = xlnx_selectmap_of_match,	},	.probe  = xilinx_selectmap_probe,}; module_platform_driver(xilinx_selectmap_driver); MODULE_LICENSE("GPL");MODULE_AUTHOR("Charles Perry <charles.perry@savoirfairelinux.com>");MODULE_DESCRIPTION("Load Xilinx FPGA firmware over SelectMap");