2018-06-30 03:53:28 +03:00
// SPDX-License-Identifier: GPL-2.0
/*
* FPGA Region Driver for FPGA Management Engine ( FME )
*
* Copyright ( C ) 2017 - 2018 Intel Corporation , Inc .
*
* Authors :
* Wu Hao < hao . wu @ intel . com >
* Joseph Grecco < joe . grecco @ intel . com >
* Enno Luebbers < enno . luebbers @ intel . com >
* Tim Whisonant < tim . whisonant @ intel . com >
* Ananda Ravuri < ananda . ravuri @ intel . com >
* Henry Mitchel < henry . mitchel @ intel . com >
*/
# include <linux/module.h>
2018-09-12 17:43:23 +03:00
# include <linux/fpga/fpga-mgr.h>
2018-06-30 03:53:28 +03:00
# include <linux/fpga/fpga-region.h>
# include "dfl-fme-pr.h"
static int fme_region_get_bridges ( struct fpga_region * region )
{
struct dfl_fme_region_pdata * pdata = region - > priv ;
struct device * dev = & pdata - > br - > dev ;
return fpga_bridge_get_to_list ( dev , region - > info , & region - > bridge_list ) ;
}
static int fme_region_probe ( struct platform_device * pdev )
{
struct dfl_fme_region_pdata * pdata = dev_get_platdata ( & pdev - > dev ) ;
struct device * dev = & pdev - > dev ;
struct fpga_region * region ;
struct fpga_manager * mgr ;
int ret ;
mgr = fpga_mgr_get ( & pdata - > mgr - > dev ) ;
if ( IS_ERR ( mgr ) )
return - EPROBE_DEFER ;
2018-10-16 01:20:03 +03:00
region = devm_fpga_region_create ( dev , mgr , fme_region_get_bridges ) ;
2018-06-30 03:53:28 +03:00
if ( ! region ) {
ret = - ENOMEM ;
goto eprobe_mgr_put ;
}
region - > priv = pdata ;
2018-06-30 03:53:29 +03:00
region - > compat_id = mgr - > compat_id ;
2018-06-30 03:53:28 +03:00
platform_set_drvdata ( pdev , region ) ;
ret = fpga_region_register ( region ) ;
if ( ret )
2018-10-16 01:20:03 +03:00
goto eprobe_mgr_put ;
2018-06-30 03:53:28 +03:00
dev_dbg ( dev , " DFL FME FPGA Region probed \n " ) ;
return 0 ;
eprobe_mgr_put :
fpga_mgr_put ( mgr ) ;
return ret ;
}
static int fme_region_remove ( struct platform_device * pdev )
{
2018-11-12 22:38:34 +03:00
struct fpga_region * region = platform_get_drvdata ( pdev ) ;
2018-09-12 17:43:23 +03:00
struct fpga_manager * mgr = region - > mgr ;
2018-06-30 03:53:28 +03:00
fpga_region_unregister ( region ) ;
2018-09-12 17:43:23 +03:00
fpga_mgr_put ( mgr ) ;
2018-06-30 03:53:28 +03:00
return 0 ;
}
static struct platform_driver fme_region_driver = {
. driver = {
. name = DFL_FPGA_FME_REGION ,
} ,
. probe = fme_region_probe ,
. remove = fme_region_remove ,
} ;
module_platform_driver ( fme_region_driver ) ;
MODULE_DESCRIPTION ( " FPGA Region for DFL FPGA Management Engine " ) ;
MODULE_AUTHOR ( " Intel Corporation " ) ;
MODULE_LICENSE ( " GPL v2 " ) ;
MODULE_ALIAS ( " platform:dfl-fme-region " ) ;