summaryrefslogtreecommitdiff
path: root/drivers/emac-dwc-eqos/DWC_ETH_QOS_poll_support.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/emac-dwc-eqos/DWC_ETH_QOS_poll_support.c')
-rw-r--r--drivers/emac-dwc-eqos/DWC_ETH_QOS_poll_support.c35
1 files changed, 20 insertions, 15 deletions
diff --git a/drivers/emac-dwc-eqos/DWC_ETH_QOS_poll_support.c b/drivers/emac-dwc-eqos/DWC_ETH_QOS_poll_support.c
index 163427b..1e2c998 100644
--- a/drivers/emac-dwc-eqos/DWC_ETH_QOS_poll_support.c
+++ b/drivers/emac-dwc-eqos/DWC_ETH_QOS_poll_support.c
@@ -36,7 +36,7 @@ static ssize_t pps_fops_read(struct file *filp, char __user *buf,
unsigned int len = 0, buf_len = 5000;
char* temp_buf;
- ssize_t ret_cnt;
+ ssize_t ret_cnt = 0;
struct pps_info *info;
info = filp->private_data;
@@ -54,7 +54,8 @@ static ssize_t pps_fops_read(struct file *filp, char __user *buf,
ret_cnt = simple_read_from_buffer(buf, count, f_pos, temp_buf, len);
kfree(temp_buf);
- EMACERR("poll pps2intr info=%d sent by kernel\n", gDWC_ETH_QOS_prv_data->avb_class_a_intr_cnt);
+ if (gDWC_ETH_QOS_prv_data)
+ EMACERR("poll pps2intr info=%d sent by kernel\n", gDWC_ETH_QOS_prv_data->avb_class_a_intr_cnt);
} else if (info->channel_no == AVB_CLASS_B_CHANNEL_NUM ) {
temp_buf = kzalloc(buf_len, GFP_KERNEL);
if (!temp_buf)
@@ -151,8 +152,8 @@ int pps_release(struct inode *inode, struct file *file)
.poll = pps_fops_poll,
};
-int create_pps_interrupt_info_device_node(dev_t *pps_dev_t, struct cdev* pps_cdev,
- struct class* pps_class, char *pps_dev_node_name)
+int create_pps_interrupt_info_device_node(dev_t *pps_dev_t, struct cdev** pps_cdev,
+ struct class** pps_class, char *pps_dev_node_name)
{
int ret;
EMACDBG("create_pps_interrupt_info_device_node enter \n");
@@ -164,28 +165,28 @@ int create_pps_interrupt_info_device_node(dev_t *pps_dev_t, struct cdev* pps_cde
goto alloc_chrdev1_region_fail;
}
- pps_cdev = cdev_alloc();
- if(!pps_cdev) {
+ *pps_cdev = cdev_alloc();
+ if(!*pps_cdev) {
ret = -ENOMEM;
EMACERR("failed to alloc cdev\n");
goto fail_alloc_cdev;
}
- cdev_init(pps_cdev, &pps_fops);
+ cdev_init(*pps_cdev, &pps_fops);
- ret = cdev_add(pps_cdev, *pps_dev_t, 1);
+ ret = cdev_add(*pps_cdev, *pps_dev_t, 1);
if (ret < 0) {
EMACERR(":cdev_add err=%d\n", -ret);
goto cdev1_add_fail;
}
- pps_class = class_create(THIS_MODULE, pps_dev_node_name);
- if(!pps_class) {
+ *pps_class = class_create(THIS_MODULE, pps_dev_node_name);
+ if(!*pps_class) {
ret = -ENODEV;
EMACERR("failed to create class\n");
goto fail_create_class;
}
- if (!device_create(pps_class, NULL,
+ if (!device_create(*pps_class, NULL,
*pps_dev_t, NULL, pps_dev_node_name)) {
ret = -EINVAL;
EMACERR("failed to create device_create\n");
@@ -197,9 +198,9 @@ int create_pps_interrupt_info_device_node(dev_t *pps_dev_t, struct cdev* pps_cde
return 0;
fail_create_device:
- class_destroy(pps_class);
+ class_destroy(*pps_class);
fail_create_class:
- cdev_del(pps_cdev);
+ cdev_del(*pps_cdev);
cdev1_add_fail:
fail_alloc_cdev:
unregister_chrdev_region(*pps_dev_t, 1);
@@ -210,15 +211,19 @@ int create_pps_interrupt_info_device_node(dev_t *pps_dev_t, struct cdev* pps_cde
int remove_pps_interrupt_info_device_node(struct DWC_ETH_QOS_prv_data *pdata)
{
+ cdev_del(pdata->avb_class_a_cdev);
device_destroy(pdata->avb_class_a_class, pdata->avb_class_a_dev_t);
class_destroy(pdata->avb_class_a_class);
- cdev_del(pdata->avb_class_a_cdev);
unregister_chrdev_region(pdata->avb_class_a_dev_t, 1);
+ pdata->avb_class_a_cdev = NULL;
+ pdata->avb_class_a_class = NULL;
+ cdev_del(pdata->avb_class_b_cdev);
device_destroy(pdata->avb_class_b_class, pdata->avb_class_b_dev_t);
class_destroy(pdata->avb_class_b_class);
- cdev_del(pdata->avb_class_b_cdev);
unregister_chrdev_region(pdata->avb_class_b_dev_t, 1);
+ pdata->avb_class_b_cdev = NULL;
+ pdata->avb_class_b_class = NULL;
return 0;
}