Loading arch/arm/mach-tegra/include/mach/tegra-ahb.h 0 → 100644 +19 −0 Original line number Diff line number Diff line /* * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. */ #ifndef __MACH_TEGRA_AHB_H__ #define __MACH_TEGRA_AHB_H__ extern int tegra_ahb_enable_smmu(struct device_node *ahb); #endif /* __MACH_TEGRA_AHB_H__ */ drivers/amba/tegra-ahb.c +32 −0 Original line number Diff line number Diff line Loading @@ -76,6 +76,10 @@ #define AHB_ARBITRATION_AHB_MEM_WRQUE_MST_ID 0xf8 #define AHB_ARBITRATION_XBAR_CTRL_SMMU_INIT_DONE BIT(17) static struct platform_driver tegra_ahb_driver; static const u32 tegra_ahb_gizmo[] = { AHB_ARBITRATION_DISABLE, AHB_ARBITRATION_PRIORITY_CTRL, Loading Loading @@ -124,6 +128,34 @@ static inline void gizmo_writel(struct tegra_ahb *ahb, u32 value, u32 offset) writel(value, ahb->regs + offset); } #ifdef CONFIG_ARCH_TEGRA_3x_SOC static int tegra_ahb_match_by_smmu(struct device *dev, void *data) { struct tegra_ahb *ahb = dev_get_drvdata(dev); struct device_node *dn = data; return (ahb->dev->of_node == dn) ? 1 : 0; } int tegra_ahb_enable_smmu(struct device_node *dn) { struct device *dev; u32 val; struct tegra_ahb *ahb; dev = driver_find_device(&tegra_ahb_driver.driver, NULL, dn, tegra_ahb_match_by_smmu); if (!dev) return -EPROBE_DEFER; ahb = dev_get_drvdata(dev); val = gizmo_readl(ahb, AHB_ARBITRATION_XBAR_CTRL); val |= AHB_ARBITRATION_XBAR_CTRL_SMMU_INIT_DONE; gizmo_writel(ahb, val, AHB_ARBITRATION_XBAR_CTRL); return 0; } EXPORT_SYMBOL(tegra_ahb_enable_smmu); #endif static int tegra_ahb_suspend(struct device *dev) { int i; Loading Loading
arch/arm/mach-tegra/include/mach/tegra-ahb.h 0 → 100644 +19 −0 Original line number Diff line number Diff line /* * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. */ #ifndef __MACH_TEGRA_AHB_H__ #define __MACH_TEGRA_AHB_H__ extern int tegra_ahb_enable_smmu(struct device_node *ahb); #endif /* __MACH_TEGRA_AHB_H__ */
drivers/amba/tegra-ahb.c +32 −0 Original line number Diff line number Diff line Loading @@ -76,6 +76,10 @@ #define AHB_ARBITRATION_AHB_MEM_WRQUE_MST_ID 0xf8 #define AHB_ARBITRATION_XBAR_CTRL_SMMU_INIT_DONE BIT(17) static struct platform_driver tegra_ahb_driver; static const u32 tegra_ahb_gizmo[] = { AHB_ARBITRATION_DISABLE, AHB_ARBITRATION_PRIORITY_CTRL, Loading Loading @@ -124,6 +128,34 @@ static inline void gizmo_writel(struct tegra_ahb *ahb, u32 value, u32 offset) writel(value, ahb->regs + offset); } #ifdef CONFIG_ARCH_TEGRA_3x_SOC static int tegra_ahb_match_by_smmu(struct device *dev, void *data) { struct tegra_ahb *ahb = dev_get_drvdata(dev); struct device_node *dn = data; return (ahb->dev->of_node == dn) ? 1 : 0; } int tegra_ahb_enable_smmu(struct device_node *dn) { struct device *dev; u32 val; struct tegra_ahb *ahb; dev = driver_find_device(&tegra_ahb_driver.driver, NULL, dn, tegra_ahb_match_by_smmu); if (!dev) return -EPROBE_DEFER; ahb = dev_get_drvdata(dev); val = gizmo_readl(ahb, AHB_ARBITRATION_XBAR_CTRL); val |= AHB_ARBITRATION_XBAR_CTRL_SMMU_INIT_DONE; gizmo_writel(ahb, val, AHB_ARBITRATION_XBAR_CTRL); return 0; } EXPORT_SYMBOL(tegra_ahb_enable_smmu); #endif static int tegra_ahb_suspend(struct device *dev) { int i; Loading