forked from luck/tmp_suning_uos_patched
This pull request contains Broadcom ARM/ARM64/MIPS SoCs drivers changes
for 4.21, please pull the following changes: - James fixes the firmware interface after a commit changed the use of VLA and broke large transfers - Stefan adds a timeout check for Raspberry Pi firmware transactions and updates a bunch of SoC/firmware files to use SPDX tags - Wolfram switches the GISB bus arbiter to use dev_get_drvdata() - Yangtao provides a fix for a reference leak due to a call to of_find_node_by_path() - Florian fixes the CPU re-entry point out of S3 suspend with kernels built in Thumb2 mode -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEm+Rq3+YGJdiR9yuFh9CWnEQHBwQFAlwC0o4ACgkQh9CWnEQH BwSYfxAA0AmUWIJ65Tp+UyfmKXI4ufa7Rznf7x3pJs788Fulz1Q/158oifIBHZY9 p6wc9MOFGk0uPc4HN4eVYXuUnQ1liJ6YfWPDj+rBvk9IVOZCKjRSbiELeSjEMeTy J/nC/N69rIkwkOaTNFne8SNdKba/DMgsYTLz+p0WOyktO50AAcrG4qL1avx/7QnM TjpUkQ1wKsLJZftJCUSSOcMCnSTuBpcAlRickacuFnoDi+S3QZ1Ub0rtDFP+fjb/ AHfV7jIsVJUuiWcKFrLLWFrR3lGC0Z7AB/w/EE1a8SiDfDC/dgXzZTP6j40aWL4c aYOQZI4zmrqiajEIjTOk1lV/+yp8CD+qkQ3F5WHAUi/vRTI8UiCYGw6UgsfLyi5s TE4c35HWgQs4HOmcYuzYV+7TWQ0+cwodGqom0M8As28W+/G0kw7VkmyHJw0F28Bh 2UlOETpUzKv+k+xwa17+FcT897uLGnE97N9g96BoO9EuTramBGTzKShRezC5M9Dj 7/ie8v0IY6UWasSFncT39g8P//oz/Xo5KnlPNUPYBU0Vt9aAQUCJ+O75rgPXWcYn n1qmauBiCQBv4j8JkHLxpiZEYSSBulE7/DoWt+U7A5OJQmrchi9vW2QSWPWuax3c 1DwOmo5S4M0mPveL+2v28kLfioL4qov1aEYtO/6xshGMzrCm4OQ= =yGiB -----END PGP SIGNATURE----- Merge tag 'arm-soc/for-4.21/drivers' of https://github.com/Broadcom/stblinux into next/drivers This pull request contains Broadcom ARM/ARM64/MIPS SoCs drivers changes for 4.21, please pull the following changes: - James fixes the firmware interface after a commit changed the use of VLA and broke large transfers - Stefan adds a timeout check for Raspberry Pi firmware transactions and updates a bunch of SoC/firmware files to use SPDX tags - Wolfram switches the GISB bus arbiter to use dev_get_drvdata() - Yangtao provides a fix for a reference leak due to a call to of_find_node_by_path() - Florian fixes the CPU re-entry point out of S3 suspend with kernels built in Thumb2 mode * tag 'arm-soc/for-4.21/drivers' of https://github.com/Broadcom/stblinux: soc: bcm: brcmstb: Don't leak device tree node reference firmware: raspberrypi: Switch to SPDX identifier firmware: raspberrypi: Fix firmware calls with large buffers soc: bcm: Switch raspberrypi-power to SPDX identifier firmware: raspberrypi: Define timeout for transactions bus: brcmstb_gisb: simplify getting .driver_data soc: bcm: brcmstb: Fix re-entry point with a THUMB2_KERNEL Signed-off-by: Olof Johansson <olof@lixom.net>
This commit is contained in:
commit
e5734bebed
|
@ -150,8 +150,7 @@ static ssize_t gisb_arb_get_timeout(struct device *dev,
|
||||||
struct device_attribute *attr,
|
struct device_attribute *attr,
|
||||||
char *buf)
|
char *buf)
|
||||||
{
|
{
|
||||||
struct platform_device *pdev = to_platform_device(dev);
|
struct brcmstb_gisb_arb_device *gdev = dev_get_drvdata(dev);
|
||||||
struct brcmstb_gisb_arb_device *gdev = platform_get_drvdata(pdev);
|
|
||||||
u32 timeout;
|
u32 timeout;
|
||||||
|
|
||||||
mutex_lock(&gdev->lock);
|
mutex_lock(&gdev->lock);
|
||||||
|
@ -165,8 +164,7 @@ static ssize_t gisb_arb_set_timeout(struct device *dev,
|
||||||
struct device_attribute *attr,
|
struct device_attribute *attr,
|
||||||
const char *buf, size_t count)
|
const char *buf, size_t count)
|
||||||
{
|
{
|
||||||
struct platform_device *pdev = to_platform_device(dev);
|
struct brcmstb_gisb_arb_device *gdev = dev_get_drvdata(dev);
|
||||||
struct brcmstb_gisb_arb_device *gdev = platform_get_drvdata(pdev);
|
|
||||||
int val, ret;
|
int val, ret;
|
||||||
|
|
||||||
ret = kstrtoint(buf, 10, &val);
|
ret = kstrtoint(buf, 10, &val);
|
||||||
|
@ -418,8 +416,7 @@ static int __init brcmstb_gisb_arb_probe(struct platform_device *pdev)
|
||||||
#ifdef CONFIG_PM_SLEEP
|
#ifdef CONFIG_PM_SLEEP
|
||||||
static int brcmstb_gisb_arb_suspend(struct device *dev)
|
static int brcmstb_gisb_arb_suspend(struct device *dev)
|
||||||
{
|
{
|
||||||
struct platform_device *pdev = to_platform_device(dev);
|
struct brcmstb_gisb_arb_device *gdev = dev_get_drvdata(dev);
|
||||||
struct brcmstb_gisb_arb_device *gdev = platform_get_drvdata(pdev);
|
|
||||||
|
|
||||||
gdev->saved_timeout = gisb_read(gdev, ARB_TIMER);
|
gdev->saved_timeout = gisb_read(gdev, ARB_TIMER);
|
||||||
|
|
||||||
|
@ -431,8 +428,7 @@ static int brcmstb_gisb_arb_suspend(struct device *dev)
|
||||||
*/
|
*/
|
||||||
static int brcmstb_gisb_arb_resume_noirq(struct device *dev)
|
static int brcmstb_gisb_arb_resume_noirq(struct device *dev)
|
||||||
{
|
{
|
||||||
struct platform_device *pdev = to_platform_device(dev);
|
struct brcmstb_gisb_arb_device *gdev = dev_get_drvdata(dev);
|
||||||
struct brcmstb_gisb_arb_device *gdev = platform_get_drvdata(pdev);
|
|
||||||
|
|
||||||
gisb_write(gdev, gdev->saved_timeout, ARB_TIMER);
|
gisb_write(gdev, gdev->saved_timeout, ARB_TIMER);
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,9 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Defines interfaces for interacting wtih the Raspberry Pi firmware's
|
* Defines interfaces for interacting wtih the Raspberry Pi firmware's
|
||||||
* property channel.
|
* property channel.
|
||||||
*
|
*
|
||||||
* Copyright © 2015 Broadcom
|
* 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>
|
#include <linux/dma-mapping.h>
|
||||||
|
@ -14,6 +11,7 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/of_platform.h>
|
#include <linux/of_platform.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
#include <soc/bcm2835/raspberrypi-firmware.h>
|
#include <soc/bcm2835/raspberrypi-firmware.h>
|
||||||
|
|
||||||
#define MBOX_MSG(chan, data28) (((data28) & ~0xf) | ((chan) & 0xf))
|
#define MBOX_MSG(chan, data28) (((data28) & ~0xf) | ((chan) & 0xf))
|
||||||
|
@ -21,8 +19,6 @@
|
||||||
#define MBOX_DATA28(msg) ((msg) & ~0xf)
|
#define MBOX_DATA28(msg) ((msg) & ~0xf)
|
||||||
#define MBOX_CHAN_PROPERTY 8
|
#define MBOX_CHAN_PROPERTY 8
|
||||||
|
|
||||||
#define MAX_RPI_FW_PROP_BUF_SIZE 32
|
|
||||||
|
|
||||||
static struct platform_device *rpi_hwmon;
|
static struct platform_device *rpi_hwmon;
|
||||||
|
|
||||||
struct rpi_firmware {
|
struct rpi_firmware {
|
||||||
|
@ -56,8 +52,12 @@ rpi_firmware_transaction(struct rpi_firmware *fw, u32 chan, u32 data)
|
||||||
reinit_completion(&fw->c);
|
reinit_completion(&fw->c);
|
||||||
ret = mbox_send_message(fw->chan, &message);
|
ret = mbox_send_message(fw->chan, &message);
|
||||||
if (ret >= 0) {
|
if (ret >= 0) {
|
||||||
wait_for_completion(&fw->c);
|
if (wait_for_completion_timeout(&fw->c, HZ)) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
} else {
|
||||||
|
ret = -ETIMEDOUT;
|
||||||
|
WARN_ONCE(1, "Firmware transaction timeout");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
dev_err(fw->cl.dev, "mbox_send_message returned %d\n", ret);
|
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,
|
int rpi_firmware_property(struct rpi_firmware *fw,
|
||||||
u32 tag, void *tag_data, size_t buf_size)
|
u32 tag, void *tag_data, size_t buf_size)
|
||||||
{
|
{
|
||||||
/* Single tags are very small (generally 8 bytes), so the
|
struct rpi_firmware_property_tag_header *header;
|
||||||
* 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;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (WARN_ON(buf_size > sizeof(data) - sizeof(*header)))
|
/* Some mailboxes can use over 1k bytes. Rather than checking
|
||||||
return -EINVAL;
|
* 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->tag = tag;
|
||||||
header->buf_size = buf_size;
|
header->buf_size = buf_size;
|
||||||
header->req_resp_size = 0;
|
header->req_resp_size = 0;
|
||||||
memcpy(data + sizeof(struct rpi_firmware_property_tag_header),
|
memcpy(data + sizeof(*header), tag_data, buf_size);
|
||||||
tag_data, buf_size);
|
|
||||||
|
|
||||||
ret = rpi_firmware_property_list(fw, &data, buf_size + sizeof(*header));
|
ret = rpi_firmware_property_list(fw, data, buf_size + sizeof(*header));
|
||||||
memcpy(tag_data,
|
|
||||||
data + sizeof(struct rpi_firmware_property_tag_header),
|
memcpy(tag_data, data + sizeof(*header), buf_size);
|
||||||
buf_size);
|
|
||||||
|
kfree(data);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,13 +31,17 @@ static const struct of_device_id brcmstb_machine_match[] = {
|
||||||
|
|
||||||
bool soc_is_brcmstb(void)
|
bool soc_is_brcmstb(void)
|
||||||
{
|
{
|
||||||
|
const struct of_device_id *match;
|
||||||
struct device_node *root;
|
struct device_node *root;
|
||||||
|
|
||||||
root = of_find_node_by_path("/");
|
root = of_find_node_by_path("/");
|
||||||
if (!root)
|
if (!root)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return of_match_node(brcmstb_machine_match, root) != NULL;
|
match = of_match_node(brcmstb_machine_match, root);
|
||||||
|
of_node_put(root);
|
||||||
|
|
||||||
|
return match != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 brcmstb_get_family_id(void)
|
u32 brcmstb_get_family_id(void)
|
||||||
|
|
|
@ -404,7 +404,7 @@ noinline int brcmstb_pm_s3_finish(void)
|
||||||
{
|
{
|
||||||
struct brcmstb_s3_params *params = ctrl.s3_params;
|
struct brcmstb_s3_params *params = ctrl.s3_params;
|
||||||
dma_addr_t params_pa = ctrl.s3_params_pa;
|
dma_addr_t params_pa = ctrl.s3_params_pa;
|
||||||
phys_addr_t reentry = virt_to_phys(&cpu_resume);
|
phys_addr_t reentry = virt_to_phys(&cpu_resume_arm);
|
||||||
enum bsp_initiate_command cmd;
|
enum bsp_initiate_command cmd;
|
||||||
u32 flags;
|
u32 flags;
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,5 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/* (C) 2015 Pengutronix, Alexander Aring <aar@pengutronix.de>
|
/* (C) 2015 Pengutronix, Alexander Aring <aar@pengutronix.de>
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
* Alexander Aring <aar@pengutronix.de>
|
* Alexander Aring <aar@pengutronix.de>
|
||||||
|
|
|
@ -1,9 +1,6 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
/*
|
/*
|
||||||
* Copyright © 2015 Broadcom
|
* 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.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _DT_BINDINGS_ARM_BCM2835_RPI_POWER_H
|
#ifndef _DT_BINDINGS_ARM_BCM2835_RPI_POWER_H
|
||||||
|
|
|
@ -1,9 +1,6 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
/*
|
/*
|
||||||
* Copyright © 2015 Broadcom
|
* 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.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __SOC_RASPBERRY_FIRMWARE_H__
|
#ifndef __SOC_RASPBERRY_FIRMWARE_H__
|
||||||
|
|
Loading…
Reference in New Issue
Block a user