diff options
| author | Olof Johansson <olof@lixom.net> | 2019-01-04 14:30:36 -0800 | 
|---|---|---|
| committer | Olof Johansson <olof@lixom.net> | 2019-01-04 14:31:38 -0800 | 
| commit | 00f8ccd0c95f4e604297057a5bccec86c0903d14 (patch) | |
| tree | 3ef930b38f7341be627da106f6ec31a007c207e4 /drivers/firmware/raspberrypi.c | |
| parent | 8e564895c30ca73cd9788aecb845879ddee987c3 (diff) | |
| parent | 3e730e858139c3bed9587ca50ce0f2aa12fe9523 (diff) | |
Merge branch 'next/drivers' into next/late
Merge in a few missing patches from the pull request (my copy of the
branch was behind the staged version in linux-next).
* next/drivers:
  memory: pl353: Add driver for arm pl353 static memory controller
  dt-bindings: memory: Add pl353 smc controller devicetree binding information
  firmware: qcom: scm: fix compilation error when disabled
Signed-off-by: Olof Johansson <olof@lixom.net>
Diffstat (limited to 'drivers/firmware/raspberrypi.c')
| -rw-r--r-- | drivers/firmware/raspberrypi.c | 48 | 
1 files changed, 25 insertions, 23 deletions
diff --git a/drivers/firmware/raspberrypi.c b/drivers/firmware/raspberrypi.c index a200a2174611..a13558154ac3 100644 --- a/drivers/firmware/raspberrypi.c +++ b/drivers/firmware/raspberrypi.c @@ -1,12 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Defines interfaces for interacting wtih the Raspberry Pi firmware's   * property channel.   *   * Copyright © 2015 Broadcom - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation.   */  #include <linux/dma-mapping.h> @@ -14,6 +11,7 @@  #include <linux/module.h>  #include <linux/of_platform.h>  #include <linux/platform_device.h> +#include <linux/slab.h>  #include <soc/bcm2835/raspberrypi-firmware.h>  #define MBOX_MSG(chan, data28)		(((data28) & ~0xf) | ((chan) & 0xf)) @@ -21,8 +19,6 @@  #define MBOX_DATA28(msg)		((msg) & ~0xf)  #define MBOX_CHAN_PROPERTY		8 -#define MAX_RPI_FW_PROP_BUF_SIZE	32 -  static struct platform_device *rpi_hwmon;  struct rpi_firmware { @@ -56,8 +52,12 @@ rpi_firmware_transaction(struct rpi_firmware *fw, u32 chan, u32 data)  	reinit_completion(&fw->c);  	ret = mbox_send_message(fw->chan, &message);  	if (ret >= 0) { -		wait_for_completion(&fw->c); -		ret = 0; +		if (wait_for_completion_timeout(&fw->c, HZ)) { +			ret = 0; +		} else { +			ret = -ETIMEDOUT; +			WARN_ONCE(1, "Firmware transaction timeout"); +		}  	} else {  		dev_err(fw->cl.dev, "mbox_send_message returned %d\n", ret);  	} @@ -144,28 +144,30 @@ EXPORT_SYMBOL_GPL(rpi_firmware_property_list);  int rpi_firmware_property(struct rpi_firmware *fw,  			  u32 tag, void *tag_data, size_t buf_size)  { -	/* Single tags are very small (generally 8 bytes), so the -	 * stack should be safe. -	 */ -	u8 data[sizeof(struct rpi_firmware_property_tag_header) + -		MAX_RPI_FW_PROP_BUF_SIZE]; -	struct rpi_firmware_property_tag_header *header = -		(struct rpi_firmware_property_tag_header *)data; +	struct rpi_firmware_property_tag_header *header;  	int ret; -	if (WARN_ON(buf_size > sizeof(data) - sizeof(*header))) -		return -EINVAL; +	/* Some mailboxes can use over 1k bytes. Rather than checking +	 * size and using stack or kmalloc depending on requirements, +	 * just use kmalloc. Mailboxes don't get called enough to worry +	 * too much about the time taken in the allocation. +	 */ +	void *data = kmalloc(sizeof(*header) + buf_size, GFP_KERNEL); +	if (!data) +		return -ENOMEM; + +	header = data;  	header->tag = tag;  	header->buf_size = buf_size;  	header->req_resp_size = 0; -	memcpy(data + sizeof(struct rpi_firmware_property_tag_header), -	       tag_data, buf_size); +	memcpy(data + sizeof(*header), tag_data, buf_size); + +	ret = rpi_firmware_property_list(fw, data, buf_size + sizeof(*header)); + +	memcpy(tag_data, data + sizeof(*header), buf_size); -	ret = rpi_firmware_property_list(fw, &data, buf_size + sizeof(*header)); -	memcpy(tag_data, -	       data + sizeof(struct rpi_firmware_property_tag_header), -	       buf_size); +	kfree(data);  	return ret;  }  | 
