diff options
author | Meng Dongyang <daniel.meng@rock-chips.com> | 2018-01-10 15:37:33 +0800 |
---|---|---|
committer | Tao Huang <huangtao@rock-chips.com> | 2018-01-10 16:50:41 +0800 |
commit | 79406f8ed7f3946bde88e7bfe9f6b960b8f0f82c (patch) | |
tree | 67c2d49742761e8d682b23345b04e36ad076c637 | |
parent | f689b67a368756e599291660e4b13692ec0553f8 (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.c | 28 |
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); |