mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-09 03:10:30 -04:00
Merge tag 'tegra-for-6.4-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux into soc/drivers
soc/tegra: Changes for v6.4-rc1 Contains various minor cleanups and fixes as well as support for several more wake events on Tegra234. * tag 'tegra-for-6.4-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux: soc/tegra: fuse: Remove nvmem root only access soc/tegra: cbb: tegra194: Use of_address_count() helper soc/tegra: cbb: Remove MODULE_LICENSE in non-modules soc/tegra: flowctrl: Use devm_platform_get_and_ioremap_resource() soc: tegra: cbb: Drop empty platform remove function soc/tegra: pmc: Support software wake-up for SPE soc/tegra: pmc: Add wake source interrupt for MGBE soc/tegra: pmc: Add the PMIC wake event for Tegra234 soc/tegra: bpmp: Actually free memory on error path soc/tegra: cbb: remove linux/version.h Link: https://lore.kernel.org/r/20230406124804.970394-2-thierry.reding@gmail.com Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
@@ -16,7 +16,6 @@
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/version.h>
|
||||
#include <soc/tegra/fuse.h>
|
||||
#include <soc/tegra/tegra-cbb.h>
|
||||
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/version.h>
|
||||
#include <soc/tegra/fuse.h>
|
||||
#include <soc/tegra/tegra-cbb.h>
|
||||
|
||||
@@ -2191,7 +2190,6 @@ MODULE_DEVICE_TABLE(of, tegra194_cbb_match);
|
||||
static int tegra194_cbb_get_bridges(struct tegra194_cbb *cbb, struct device_node *np)
|
||||
{
|
||||
struct tegra_cbb *entry;
|
||||
struct resource res;
|
||||
unsigned long flags;
|
||||
unsigned int i;
|
||||
int err;
|
||||
@@ -2211,8 +2209,7 @@ static int tegra194_cbb_get_bridges(struct tegra194_cbb *cbb, struct device_node
|
||||
spin_unlock_irqrestore(&cbb_lock, flags);
|
||||
|
||||
if (!cbb->bridges) {
|
||||
while (of_address_to_resource(np, cbb->num_bridges, &res) == 0)
|
||||
cbb->num_bridges++;
|
||||
cbb->num_bridges = of_address_count(np);
|
||||
|
||||
cbb->bridges = devm_kcalloc(cbb->base.dev, cbb->num_bridges,
|
||||
sizeof(*cbb->bridges), GFP_KERNEL);
|
||||
@@ -2359,4 +2356,3 @@ module_exit(tegra194_cbb_exit);
|
||||
|
||||
MODULE_AUTHOR("Sumit Gupta <sumitg@nvidia.com>");
|
||||
MODULE_DESCRIPTION("Control Backbone error handling driver for Tegra194");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/version.h>
|
||||
#include <soc/tegra/fuse.h>
|
||||
#include <soc/tegra/tegra-cbb.h>
|
||||
|
||||
@@ -1174,11 +1173,6 @@ static int tegra234_cbb_probe(struct platform_device *pdev)
|
||||
return tegra_cbb_register(&cbb->base);
|
||||
}
|
||||
|
||||
static int tegra234_cbb_remove(struct platform_device *pdev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __maybe_unused tegra234_cbb_resume_noirq(struct device *dev)
|
||||
{
|
||||
struct tegra234_cbb *cbb = dev_get_drvdata(dev);
|
||||
@@ -1196,7 +1190,6 @@ static const struct dev_pm_ops tegra234_cbb_pm = {
|
||||
|
||||
static struct platform_driver tegra234_cbb_driver = {
|
||||
.probe = tegra234_cbb_probe,
|
||||
.remove = tegra234_cbb_remove,
|
||||
.driver = {
|
||||
.name = "tegra234-cbb",
|
||||
.of_match_table = tegra234_cbb_dt_ids,
|
||||
@@ -1218,4 +1211,3 @@ static void __exit tegra234_cbb_exit(void)
|
||||
module_exit(tegra234_cbb_exit);
|
||||
|
||||
MODULE_DESCRIPTION("Control Backbone 2.0 error handling driver for Tegra234");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -156,10 +156,8 @@ void flowctrl_cpu_suspend_exit(unsigned int cpuid)
|
||||
static int tegra_flowctrl_probe(struct platform_device *pdev)
|
||||
{
|
||||
void __iomem *base = tegra_flowctrl_base;
|
||||
struct resource *res;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
tegra_flowctrl_base = devm_ioremap_resource(&pdev->dev, res);
|
||||
tegra_flowctrl_base = devm_platform_get_and_ioremap_resource(pdev, 0, NULL);
|
||||
if (IS_ERR(tegra_flowctrl_base))
|
||||
return PTR_ERR(tegra_flowctrl_base);
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2013-2022, NVIDIA CORPORATION. All rights reserved.
|
||||
* Copyright (c) 2013-2023, NVIDIA CORPORATION. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
@@ -166,7 +166,7 @@ static int tegra_fuse_probe(struct platform_device *pdev)
|
||||
nvmem.nkeepout = fuse->soc->num_keepouts;
|
||||
nvmem.type = NVMEM_TYPE_OTP;
|
||||
nvmem.read_only = true;
|
||||
nvmem.root_only = true;
|
||||
nvmem.root_only = false;
|
||||
nvmem.reg_read = tegra_fuse_read;
|
||||
nvmem.size = fuse->soc->info->size;
|
||||
nvmem.word_size = 4;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* drivers/soc/tegra/pmc.c
|
||||
*
|
||||
* Copyright (c) 2010 Google, Inc
|
||||
* Copyright (c) 2018-2022, NVIDIA CORPORATION. All rights reserved.
|
||||
* Copyright (c) 2018-2023, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Author:
|
||||
* Colin Cross <ccross@google.com>
|
||||
@@ -177,6 +177,7 @@
|
||||
/* Tegra186 and later */
|
||||
#define WAKE_AOWAKE_CNTRL(x) (0x000 + ((x) << 2))
|
||||
#define WAKE_AOWAKE_CNTRL_LEVEL (1 << 3)
|
||||
#define WAKE_AOWAKE_CNTRL_SR_CAPTURE_EN (1 << 1)
|
||||
#define WAKE_AOWAKE_MASK_W(x) (0x180 + ((x) << 2))
|
||||
#define WAKE_AOWAKE_MASK_R(x) (0x300 + ((x) << 2))
|
||||
#define WAKE_AOWAKE_STATUS_W(x) (0x30c + ((x) << 2))
|
||||
@@ -191,6 +192,8 @@
|
||||
#define WAKE_AOWAKE_CTRL 0x4f4
|
||||
#define WAKE_AOWAKE_CTRL_INTR_POLARITY BIT(0)
|
||||
|
||||
#define SW_WAKE_ID 83 /* wake83 */
|
||||
|
||||
/* for secure PMC */
|
||||
#define TEGRA_SMC_PMC 0xc2fffe00
|
||||
#define TEGRA_SMC_PMC_READ 0xaa
|
||||
@@ -355,6 +358,7 @@ struct tegra_pmc_soc {
|
||||
void (*setup_irq_polarity)(struct tegra_pmc *pmc,
|
||||
struct device_node *np,
|
||||
bool invert);
|
||||
void (*set_wake_filters)(struct tegra_pmc *pmc);
|
||||
int (*irq_set_wake)(struct irq_data *data, unsigned int on);
|
||||
int (*irq_set_type)(struct irq_data *data, unsigned int type);
|
||||
int (*powergate_set)(struct tegra_pmc *pmc, unsigned int id,
|
||||
@@ -2416,6 +2420,17 @@ static int tegra210_pmc_irq_set_type(struct irq_data *data, unsigned int type)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void tegra186_pmc_set_wake_filters(struct tegra_pmc *pmc)
|
||||
{
|
||||
u32 value;
|
||||
|
||||
/* SW Wake (wake83) needs SR_CAPTURE filter to be enabled */
|
||||
value = readl(pmc->wake + WAKE_AOWAKE_CNTRL(SW_WAKE_ID));
|
||||
value |= WAKE_AOWAKE_CNTRL_SR_CAPTURE_EN;
|
||||
writel(value, pmc->wake + WAKE_AOWAKE_CNTRL(SW_WAKE_ID));
|
||||
dev_dbg(pmc->dev, "WAKE_AOWAKE_CNTRL_83 = 0x%x\n", value);
|
||||
}
|
||||
|
||||
static int tegra186_pmc_irq_set_wake(struct irq_data *data, unsigned int on)
|
||||
{
|
||||
struct tegra_pmc *pmc = irq_data_get_irq_chip_data(data);
|
||||
@@ -3042,6 +3057,10 @@ static int tegra_pmc_probe(struct platform_device *pdev)
|
||||
platform_set_drvdata(pdev, pmc);
|
||||
tegra_pm_init_suspend();
|
||||
|
||||
/* Some wakes require specific filter configuration */
|
||||
if (pmc->soc->set_wake_filters)
|
||||
pmc->soc->set_wake_filters(pmc);
|
||||
|
||||
return 0;
|
||||
|
||||
cleanup_powergates:
|
||||
@@ -3938,6 +3957,7 @@ static const struct tegra_pmc_soc tegra186_pmc_soc = {
|
||||
.regs = &tegra186_pmc_regs,
|
||||
.init = tegra186_pmc_init,
|
||||
.setup_irq_polarity = tegra186_pmc_setup_irq_polarity,
|
||||
.set_wake_filters = tegra186_pmc_set_wake_filters,
|
||||
.irq_set_wake = tegra186_pmc_irq_set_wake,
|
||||
.irq_set_type = tegra186_pmc_irq_set_type,
|
||||
.reset_sources = tegra186_reset_sources,
|
||||
@@ -4122,6 +4142,7 @@ static const struct tegra_pmc_soc tegra194_pmc_soc = {
|
||||
.regs = &tegra194_pmc_regs,
|
||||
.init = tegra186_pmc_init,
|
||||
.setup_irq_polarity = tegra186_pmc_setup_irq_polarity,
|
||||
.set_wake_filters = tegra186_pmc_set_wake_filters,
|
||||
.irq_set_wake = tegra186_pmc_irq_set_wake,
|
||||
.irq_set_type = tegra186_pmc_irq_set_type,
|
||||
.reset_sources = tegra194_reset_sources,
|
||||
@@ -4225,7 +4246,9 @@ static const char * const tegra234_reset_sources[] = {
|
||||
};
|
||||
|
||||
static const struct tegra_wake_event tegra234_wake_events[] = {
|
||||
TEGRA_WAKE_IRQ("pmu", 24, 209),
|
||||
TEGRA_WAKE_GPIO("power", 29, 1, TEGRA234_AON_GPIO(EE, 4)),
|
||||
TEGRA_WAKE_GPIO("mgbe", 56, 0, TEGRA234_MAIN_GPIO(Y, 3)),
|
||||
TEGRA_WAKE_IRQ("rtc", 73, 10),
|
||||
};
|
||||
|
||||
@@ -4247,6 +4270,7 @@ static const struct tegra_pmc_soc tegra234_pmc_soc = {
|
||||
.regs = &tegra234_pmc_regs,
|
||||
.init = tegra186_pmc_init,
|
||||
.setup_irq_polarity = tegra186_pmc_setup_irq_polarity,
|
||||
.set_wake_filters = tegra186_pmc_set_wake_filters,
|
||||
.irq_set_wake = tegra186_pmc_irq_set_wake,
|
||||
.irq_set_type = tegra186_pmc_irq_set_type,
|
||||
.reset_sources = tegra234_reset_sources,
|
||||
|
||||
@@ -286,7 +286,7 @@ static int tegra_bpmp_add_powergates(struct tegra_bpmp *bpmp,
|
||||
tegra_powergate_remove(powergate);
|
||||
}
|
||||
|
||||
kfree(genpd->domains);
|
||||
kfree(domains);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user