tegra186.c (5c9016f0a8a3ba30c6593d2cb0d067164dd41846) tegra186.c (7355c7b9ae0d45923bac088bc1faebd5e9a66164)
1// SPDX-License-Identifier: GPL-2.0-only
2/*
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (C) 2017 NVIDIA CORPORATION. All rights reserved.
3 * Copyright (C) 2017-2021 NVIDIA CORPORATION. All rights reserved.
4 */
5
6#include <linux/io.h>
7#include <linux/module.h>
8#include <linux/mod_devicetable.h>
9#include <linux/of_device.h>
10#include <linux/platform_device.h>
11

--- 28 unchanged lines hidden (view full) ---

40 override = readl(mc->regs + client->regs.sid.override);
41 security = readl(mc->regs + client->regs.sid.security);
42
43 dev_dbg(mc->dev, "client %s: override: %x security: %x\n",
44 client->name, override, security);
45 }
46}
47
4 */
5
6#include <linux/io.h>
7#include <linux/module.h>
8#include <linux/mod_devicetable.h>
9#include <linux/of_device.h>
10#include <linux/platform_device.h>
11

--- 28 unchanged lines hidden (view full) ---

40 override = readl(mc->regs + client->regs.sid.override);
41 security = readl(mc->regs + client->regs.sid.security);
42
43 dev_dbg(mc->dev, "client %s: override: %x security: %x\n",
44 client->name, override, security);
45 }
46}
47
48static int tegra186_mc_probe(struct tegra_mc *mc)
49{
50 int err;
51
52 err = of_platform_populate(mc->dev->of_node, NULL, NULL, mc->dev);
53 if (err < 0)
54 return err;
55
56 tegra186_mc_program_sid(mc);
57
58 return 0;
59}
60
61static void tegra186_mc_remove(struct tegra_mc *mc)
62{
63 of_platform_depopulate(mc->dev);
64}
65
48static int tegra186_mc_resume(struct tegra_mc *mc)
49{
50 tegra186_mc_program_sid(mc);
51
52 return 0;
53}
54
55static const struct tegra_mc_ops tegra186_mc_ops = {
66static int tegra186_mc_resume(struct tegra_mc *mc)
67{
68 tegra186_mc_program_sid(mc);
69
70 return 0;
71}
72
73static const struct tegra_mc_ops tegra186_mc_ops = {
74 .probe = tegra186_mc_probe,
75 .remove = tegra186_mc_remove,
56 .resume = tegra186_mc_resume,
57};
58
59#if defined(CONFIG_ARCH_TEGRA_186_SOC)
60static const struct tegra_mc_client tegra186_mc_clients[] = {
61 {
62 .name = "ptcr",
63 .sid = TEGRA186_SID_PASSTHROUGH,

--- 640 unchanged lines hidden (view full) ---

704 .sid = {
705 .override = 0x518,
706 .security = 0x51c,
707 },
708 },
709 },
710};
711
76 .resume = tegra186_mc_resume,
77};
78
79#if defined(CONFIG_ARCH_TEGRA_186_SOC)
80static const struct tegra_mc_client tegra186_mc_clients[] = {
81 {
82 .name = "ptcr",
83 .sid = TEGRA186_SID_PASSTHROUGH,

--- 640 unchanged lines hidden (view full) ---

724 .sid = {
725 .override = 0x518,
726 .security = 0x51c,
727 },
728 },
729 },
730};
731
712static const struct tegra_mc_soc tegra186_mc_soc = {
732const struct tegra_mc_soc tegra186_mc_soc = {
713 .num_clients = ARRAY_SIZE(tegra186_mc_clients),
714 .clients = tegra186_mc_clients,
733 .num_clients = ARRAY_SIZE(tegra186_mc_clients),
734 .clients = tegra186_mc_clients,
735 .num_address_bits = 40,
715 .ops = &tegra186_mc_ops,
716};
717#endif
718
719#if defined(CONFIG_ARCH_TEGRA_194_SOC)
720static const struct tegra_mc_client tegra194_mc_clients[] = {
721 {
722 .name = "ptcr",

--- 1190 unchanged lines hidden (view full) ---

1913 .sid = {
1914 .override = 0x7f8,
1915 .security = 0x7fc,
1916 },
1917 },
1918 },
1919};
1920
736 .ops = &tegra186_mc_ops,
737};
738#endif
739
740#if defined(CONFIG_ARCH_TEGRA_194_SOC)
741static const struct tegra_mc_client tegra194_mc_clients[] = {
742 {
743 .name = "ptcr",

--- 1190 unchanged lines hidden (view full) ---

1934 .sid = {
1935 .override = 0x7f8,
1936 .security = 0x7fc,
1937 },
1938 },
1939 },
1940};
1941
1921static const struct tegra_mc_soc tegra194_mc_soc = {
1942const struct tegra_mc_soc tegra194_mc_soc = {
1922 .num_clients = ARRAY_SIZE(tegra194_mc_clients),
1923 .clients = tegra194_mc_clients,
1943 .num_clients = ARRAY_SIZE(tegra194_mc_clients),
1944 .clients = tegra194_mc_clients,
1945 .num_address_bits = 40,
1924 .ops = &tegra186_mc_ops,
1925};
1926#endif
1946 .ops = &tegra186_mc_ops,
1947};
1948#endif
1927
1928static int tegra186_mc_probe(struct platform_device *pdev)
1929{
1930 struct resource *res;
1931 struct tegra_mc *mc;
1932 int err;
1933
1934 mc = devm_kzalloc(&pdev->dev, sizeof(*mc), GFP_KERNEL);
1935 if (!mc)
1936 return -ENOMEM;
1937
1938 mc->soc = of_device_get_match_data(&pdev->dev);
1939
1940 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1941 mc->regs = devm_ioremap_resource(&pdev->dev, res);
1942 if (IS_ERR(mc->regs))
1943 return PTR_ERR(mc->regs);
1944
1945 mc->dev = &pdev->dev;
1946
1947 err = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev);
1948 if (err < 0)
1949 return err;
1950
1951 platform_set_drvdata(pdev, mc);
1952 tegra186_mc_program_sid(mc);
1953
1954 return 0;
1955}
1956
1957static int tegra186_mc_remove(struct platform_device *pdev)
1958{
1959 struct tegra_mc *mc = platform_get_drvdata(pdev);
1960
1961 of_platform_depopulate(mc->dev);
1962
1963 return 0;
1964}
1965
1966static const struct of_device_id tegra186_mc_of_match[] = {
1967#if defined(CONFIG_ARCH_TEGRA_186_SOC)
1968 { .compatible = "nvidia,tegra186-mc", .data = &tegra186_mc_soc },
1969#endif
1970#if defined(CONFIG_ARCH_TEGRA_194_SOC)
1971 { .compatible = "nvidia,tegra194-mc", .data = &tegra194_mc_soc },
1972#endif
1973 { /* sentinel */ }
1974};
1975MODULE_DEVICE_TABLE(of, tegra186_mc_of_match);
1976
1977static int __maybe_unused tegra_mc_suspend(struct device *dev)
1978{
1979 struct tegra_mc *mc = dev_get_drvdata(dev);
1980
1981 if (mc->soc->ops && mc->soc->ops->suspend)
1982 return mc->soc->ops->suspend(mc);
1983
1984 return 0;
1985}
1986
1987static int __maybe_unused tegra_mc_resume(struct device *dev)
1988{
1989 struct tegra_mc *mc = dev_get_drvdata(dev);
1990
1991 if (mc->soc->ops && mc->soc->ops->resume)
1992 return mc->soc->ops->resume(mc);
1993
1994 return 0;
1995}
1996
1997static const struct dev_pm_ops tegra186_mc_pm_ops = {
1998 SET_SYSTEM_SLEEP_PM_OPS(tegra_mc_suspend, tegra_mc_resume)
1999};
2000
2001static struct platform_driver tegra186_mc_driver = {
2002 .driver = {
2003 .name = "tegra186-mc",
2004 .of_match_table = tegra186_mc_of_match,
2005 .pm = &tegra186_mc_pm_ops,
2006 .suppress_bind_attrs = true,
2007 },
2008 .probe = tegra186_mc_probe,
2009 .remove = tegra186_mc_remove,
2010};
2011module_platform_driver(tegra186_mc_driver);
2012
2013MODULE_AUTHOR("Thierry Reding <treding@nvidia.com>");
2014MODULE_DESCRIPTION("NVIDIA Tegra186 Memory Controller driver");
2015MODULE_LICENSE("GPL v2");