summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMeng Dongyang <daniel.meng@rock-chips.com>2018-01-10 15:37:33 +0800
committerTao Huang <huangtao@rock-chips.com>2018-01-10 16:50:41 +0800
commit79406f8ed7f3946bde88e7bfe9f6b960b8f0f82c (patch)
tree67c2d49742761e8d682b23345b04e36ad076c637
parentf689b67a368756e599291660e4b13692ec0553f8 (diff)
usb: dwc_otg_310: fix NULL pointer error from driver attributes
In current code, the driver attributes of DWC2 controller is created during driver initialization, if we get or set them before finish probe device, the device's pointer in attribute function will be NULL and this will crash the system. So this patch make the function return directly if the pointer is NULL. The attributes mention above: /sys/bus/platform/drivers/usb20_otg/dwc_otg_conn_en /sys/bus/platform/drivers/usb20_otg/force_usb_mode /sys/bus/platform/drivers/usb20_otg/vbus_status Change-Id: If063a884249afa7172bf28719b8c2b8a5641ac4b Signed-off-by: Meng Dongyang <daniel.meng@rock-chips.com>
-rw-r--r--drivers/usb/dwc_otg_310/dwc_otg_driver.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/drivers/usb/dwc_otg_310/dwc_otg_driver.c b/drivers/usb/dwc_otg_310/dwc_otg_driver.c
index 5bd44a2485f5..b895efaa67e4 100644
--- a/drivers/usb/dwc_otg_310/dwc_otg_driver.c
+++ b/drivers/usb/dwc_otg_310/dwc_otg_driver.c
@@ -419,9 +419,11 @@ void dwc_otg_force_device(dwc_otg_core_if_t *core_if)
static ssize_t force_usb_mode_show(struct device_driver *drv, char *buf)
{
dwc_otg_device_t *otg_dev = g_otgdev;
- dwc_otg_core_if_t *core_if = otg_dev->core_if;
- return sprintf(buf, "%d\n", core_if->usb_mode);
+ if (!otg_dev)
+ return -EINVAL;
+
+ return sprintf(buf, "%d\n", otg_dev->core_if->usb_mode);
}
static ssize_t force_usb_mode_store(struct device_driver *drv, const char *buf,
@@ -511,8 +513,11 @@ static ssize_t dwc_otg_conn_en_show(struct device_driver *_drv, char *_buf)
{
dwc_otg_device_t *otg_dev = g_otgdev;
- dwc_otg_pcd_t *_pcd = otg_dev->pcd;
- return sprintf(_buf, "%d\n", _pcd->conn_en);
+
+ if (!otg_dev)
+ return -EINVAL;
+
+ return sprintf(_buf, "%d\n", otg_dev->pcd->conn_en);
}
@@ -521,10 +526,12 @@ static ssize_t dwc_otg_conn_en_store(struct device_driver *_drv,
{
int enable = simple_strtoul(_buf, NULL, 10);
dwc_otg_device_t *otg_dev = g_otgdev;
- dwc_otg_pcd_t *_pcd = otg_dev->pcd;
- DWC_PRINTF("%s %d->%d\n", __func__, _pcd->conn_en, enable);
- _pcd->conn_en = enable;
+ if (!otg_dev)
+ return -EINVAL;
+
+ DWC_PRINTF("%s %d->%d\n", __func__, otg_dev->pcd->conn_en, enable);
+ otg_dev->pcd->conn_en = enable;
return _count;
}
@@ -571,8 +578,11 @@ static DRIVER_ATTR(op_state, S_IRUGO, dwc_otg_op_state_show, NULL);
static ssize_t vbus_status_show(struct device_driver *_drv, char *_buf)
{
dwc_otg_device_t *otg_dev = g_otgdev;
- dwc_otg_pcd_t *_pcd = otg_dev->pcd;
- return sprintf(_buf, "%d\n", _pcd->vbus_status);
+
+ if (!otg_dev)
+ return -EINVAL;
+
+ return sprintf(_buf, "%d\n", otg_dev->pcd->vbus_status);
}
static DRIVER_ATTR(vbus_status, S_IRUGO, vbus_status_show, NULL);