Commit 2d45c267 authored by Federico Vaga's avatar Federico Vaga

drv: bugfix, register trigger type only once

The bug is that on a second TDC instance, the driver will try to register
again the trigger type. The trigger type needs to be registered only once
at module_init
Signed-off-by: Federico Vaga's avatarFederico Vaga <federico.vaga@cern.ch>
parent c3f23abb
......@@ -101,7 +101,7 @@ struct ft_hw_timestamp {
#include "hw/tdc_eic.h"
#include "hw/tdc_dma_eic.h"
extern struct zio_trigger_type ft_trig_type;
extern struct workqueue_struct *ft_workqueue;
#define FT_USER_OFFSET_RANGE 1000000000 /* picoseconds */
......
......@@ -593,6 +593,13 @@ static int ft_init(void)
if (ft_workqueue == NULL)
return -ENOMEM;
ret = zio_register_trig(&ft_trig_type, FT_ZIO_TRIG_TYPE_NAME);
if (ret) {
pr_err("fmc-tdc: cannot register ZIO trigger type \"%s\" (error %i)\n",
FT_ZIO_TRIG_TYPE_NAME, ret);
goto err_zio_trg;
}
ret = ft_zio_register();
if (ret < 0)
goto err_zio;
......@@ -606,6 +613,8 @@ static int ft_init(void)
err_fmc:
ft_zio_unregister();
err_zio:
zio_unregister_trig(&ft_trig_type);
err_zio_trg:
destroy_workqueue(ft_workqueue);
return ret;
......@@ -615,6 +624,7 @@ static void ft_exit(void)
{
fmc_driver_unregister(&ft_drv);
ft_zio_unregister();
zio_unregister_trig(&ft_trig_type);
destroy_workqueue(ft_workqueue);
}
......
......@@ -551,19 +551,10 @@ int ft_zio_init(struct fmctdc_dev *ft)
int err = 0;
int dev_id;
err = zio_register_trig(&ft_trig_type, FT_ZIO_TRIG_TYPE_NAME);
if (err) {
dev_err(&ft->fmc->dev,
"Cannot register ZIO trigger type \"%s\" (error %i)\n",
FT_ZIO_TRIG_TYPE_NAME, err);
return err;
}
ft->hwzdev = zio_allocate_device();
if (IS_ERR(ft->hwzdev)) {
err = PTR_ERR(ft->hwzdev);
goto err_dev_alloc;
}
if (IS_ERR(ft->hwzdev))
return PTR_ERR(ft->hwzdev);
/* Mandatory fields */
ft->hwzdev->owner = THIS_MODULE;
......@@ -579,8 +570,6 @@ int ft_zio_init(struct fmctdc_dev *ft)
err_dev_reg:
zio_free_device(ft->hwzdev);
err_dev_alloc:
zio_unregister_trig(&ft_trig_type);
return err;
}
......@@ -588,5 +577,4 @@ void ft_zio_exit(struct fmctdc_dev *ft)
{
zio_unregister_device(ft->hwzdev);
zio_free_device(ft->hwzdev);
zio_unregister_trig(&ft_trig_type);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment