Commit 5f6091a0 authored by Lee Jones's avatar Lee Jones Committed by Linus Walleij

usb: musb: ux500: harden checks for platform data

In its current state, the ux500-musb driver uses platform data pointers
blindly with no prior checking. If no platform data pointer is passed
this will Oops the kernel. In this patch we ensure platform data and
board data are present prior to using them.

Cc: linux-usb@vger.kernel.org
Acked-by: default avatarFelipe Balbi <balbi@ti.com>
Acked-by: default avatarFabio Baltieri <fabio.baltieri@linaro.org>
Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 1e6eebb4
...@@ -289,7 +289,7 @@ static int ux500_dma_controller_start(struct dma_controller *c) ...@@ -289,7 +289,7 @@ static int ux500_dma_controller_start(struct dma_controller *c)
struct musb *musb = controller->private_data; struct musb *musb = controller->private_data;
struct device *dev = musb->controller; struct device *dev = musb->controller;
struct musb_hdrc_platform_data *plat = dev->platform_data; struct musb_hdrc_platform_data *plat = dev->platform_data;
struct ux500_musb_board_data *data = plat->board_data; struct ux500_musb_board_data *data;
struct dma_channel *dma_channel = NULL; struct dma_channel *dma_channel = NULL;
u32 ch_num; u32 ch_num;
u8 dir; u8 dir;
...@@ -299,14 +299,19 @@ static int ux500_dma_controller_start(struct dma_controller *c) ...@@ -299,14 +299,19 @@ static int ux500_dma_controller_start(struct dma_controller *c)
struct ux500_dma_channel *channel_array; struct ux500_dma_channel *channel_array;
dma_cap_mask_t mask; dma_cap_mask_t mask;
if (!plat) {
dev_err(musb->controller, "No platform data\n");
return -EINVAL;
}
data = plat->board_data;
dma_cap_zero(mask); dma_cap_zero(mask);
dma_cap_set(DMA_SLAVE, mask); dma_cap_set(DMA_SLAVE, mask);
/* Prepare the loop for RX channels */ /* Prepare the loop for RX channels */
channel_array = controller->rx_channel; channel_array = controller->rx_channel;
param_array = data->dma_rx_param_array; param_array = data ? data->dma_rx_param_array : NULL;
for (dir = 0; dir < 2; dir++) { for (dir = 0; dir < 2; dir++) {
for (ch_num = 0; for (ch_num = 0;
...@@ -339,7 +344,7 @@ static int ux500_dma_controller_start(struct dma_controller *c) ...@@ -339,7 +344,7 @@ static int ux500_dma_controller_start(struct dma_controller *c)
/* Prepare the loop for TX channels */ /* Prepare the loop for TX channels */
channel_array = controller->tx_channel; channel_array = controller->tx_channel;
param_array = data->dma_tx_param_array; param_array = data ? data->dma_tx_param_array : NULL;
is_tx = 1; is_tx = 1;
} }
......
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