[PATCH 3/3] dmaengine i.MX SDMA: use request_firmware_nowait

Koul, Vinod vinod.koul at intel.com
Thu Aug 25 14:01:57 EDT 2011


On Thu, 2011-08-25 at 11:03 +0200, Sascha Hauer wrote:
> The firmware blob may not be available when the driver
> probes. Instead of blocking the whole kernel use
> request_firmware_nowait() and continue without firmware.
> The ROM scripts can already be used then if available.
> For the devicetree case the ROM scripts are not available,
> still the probe function should not block. The driver
> will be unusable in this case, but we have no way of
> detecting this properly. The configuration of the dma
> channels will fail, so nothing bad should happen.
Shouldn't you track if firmware is loaded properly and in the case it is
not return error in your prepare functions?

--
~Vinod
> 
> Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
> ---
>  drivers/dma/imx-sdma.c |   23 ++++++++++++++++-------
>  1 files changed, 16 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c
> index 8abf8c1..b5cc27d 100644
> --- a/drivers/dma/imx-sdma.c
> +++ b/drivers/dma/imx-sdma.c
> @@ -1143,18 +1143,17 @@ static void sdma_add_scripts(struct sdma_engine *sdma,
>  			saddr_arr[i] = addr_arr[i];
>  }
>  
> -static int __init sdma_get_firmware(struct sdma_engine *sdma,
> -		const char *fw_name)
> +static void sdma_load_firmware(const struct firmware *fw, void *context)
>  {
> -	const struct firmware *fw;
> +	struct sdma_engine *sdma = context;
>  	const struct sdma_firmware_header *header;
> -	int ret;
>  	const struct sdma_script_start_addrs *addr;
>  	unsigned short *ram_code;
>  
> -	ret = request_firmware(&fw, fw_name, sdma->dev);
> -	if (ret)
> -		return ret;
> +	if (!fw) {
> +		dev_err(sdma->dev, "firmware not found\n");
> +		return;
> +	}
>  
>  	if (fw->size < sizeof(*header))
>  		goto err_firmware;
> @@ -1184,6 +1183,16 @@ static int __init sdma_get_firmware(struct sdma_engine *sdma,
>  
>  err_firmware:
>  	release_firmware(fw);
> +}
> +
> +static int __init sdma_get_firmware(struct sdma_engine *sdma,
> +		const char *fw_name)
> +{
> +	int ret;
> +
> +	ret = request_firmware_nowait(THIS_MODULE,
> +			FW_ACTION_HOTPLUG, fw_name, sdma->dev,
> +			GFP_KERNEL, sdma, sdma_load_firmware);
>  
>  	return ret;
>  }






More information about the linux-arm-kernel mailing list