aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/mediatek/patches/0006-soc-mediatek-Add-infracfg-misc-driver-support.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/mediatek/patches/0006-soc-mediatek-Add-infracfg-misc-driver-support.patch')
-rw-r--r--target/linux/mediatek/patches/0006-soc-mediatek-Add-infracfg-misc-driver-support.patch179
1 files changed, 179 insertions, 0 deletions
diff --git a/target/linux/mediatek/patches/0006-soc-mediatek-Add-infracfg-misc-driver-support.patch b/target/linux/mediatek/patches/0006-soc-mediatek-Add-infracfg-misc-driver-support.patch
new file mode 100644
index 0000000000..f47c19373e
--- /dev/null
+++ b/target/linux/mediatek/patches/0006-soc-mediatek-Add-infracfg-misc-driver-support.patch
@@ -0,0 +1,179 @@
+From d6d7a7dc1b7db2e3d496bf67b30abc894edbc4bd Mon Sep 17 00:00:00 2001
+From: Sascha Hauer <s.hauer@pengutronix.de>
+Date: Tue, 9 Jun 2015 10:46:59 +0200
+Subject: [PATCH 06/76] soc: mediatek: Add infracfg misc driver support
+
+This adds support for some miscellaneous bits of the infracfg controller.
+The mtk_infracfg_set/clear_bus_protection functions are necessary for
+the scpsys power domain driver to handle the bus protection bits which
+are contained in the infacfg register space.
+
+Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
+---
+ drivers/soc/mediatek/Kconfig | 9 ++++
+ drivers/soc/mediatek/Makefile | 1 +
+ drivers/soc/mediatek/mtk-infracfg.c | 91 +++++++++++++++++++++++++++++++++
+ include/linux/soc/mediatek/infracfg.h | 26 ++++++++++
+ 4 files changed, 127 insertions(+)
+ create mode 100644 drivers/soc/mediatek/mtk-infracfg.c
+ create mode 100644 include/linux/soc/mediatek/infracfg.h
+
+diff --git a/drivers/soc/mediatek/Kconfig b/drivers/soc/mediatek/Kconfig
+index 3c18503..09da41e 100644
+--- a/drivers/soc/mediatek/Kconfig
++++ b/drivers/soc/mediatek/Kconfig
+@@ -1,6 +1,15 @@
+ #
+ # MediaTek SoC drivers
+ #
++config MTK_INFRACFG
++ bool "MediaTek INFRACFG Support"
++ depends on ARCH_MEDIATEK
++ select REGMAP
++ help
++ Say yes here to add support for the MediaTek INFRACFG controller. The
++ INFRACFG controller contains various infrastructure registers not
++ directly associated to any device.
++
+ config MTK_PMIC_WRAP
+ tristate "MediaTek PMIC Wrapper Support"
+ depends on ARCH_MEDIATEK
+diff --git a/drivers/soc/mediatek/Makefile b/drivers/soc/mediatek/Makefile
+index ecaf4de..3fa940f 100644
+--- a/drivers/soc/mediatek/Makefile
++++ b/drivers/soc/mediatek/Makefile
+@@ -1 +1,2 @@
++obj-$(CONFIG_MTK_INFRACFG) += mtk-infracfg.o
+ obj-$(CONFIG_MTK_PMIC_WRAP) += mtk-pmic-wrap.o
+diff --git a/drivers/soc/mediatek/mtk-infracfg.c b/drivers/soc/mediatek/mtk-infracfg.c
+new file mode 100644
+index 0000000..ca786e0
+--- /dev/null
++++ b/drivers/soc/mediatek/mtk-infracfg.c
+@@ -0,0 +1,91 @@
++/*
++ * Copyright (c) 2015 Pengutronix, Sascha Hauer <kernel@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.
++ *
++ * This program is distributed in the hope that 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.
++ */
++
++#include <linux/export.h>
++#include <linux/jiffies.h>
++#include <linux/regmap.h>
++#include <linux/soc/mediatek/infracfg.h>
++#include <asm/processor.h>
++
++#define INFRA_TOPAXI_PROTECTEN 0x0220
++#define INFRA_TOPAXI_PROTECTSTA1 0x0228
++
++/**
++ * mtk_infracfg_set_bus_protection - enable bus protection
++ * @regmap: The infracfg regmap
++ * @mask: The mask containing the protection bits to be enabled.
++ *
++ * This function enables the bus protection bits for disabled power
++ * domains so that the system does not hanf when some unit accesses the
++ * bus while in power down.
++ */
++int mtk_infracfg_set_bus_protection(struct regmap *infracfg, u32 mask)
++{
++ unsigned long expired;
++ u32 val;
++ int ret;
++
++ regmap_update_bits(infracfg, INFRA_TOPAXI_PROTECTEN, mask, mask);
++
++ expired = jiffies + HZ;
++
++ while (1) {
++ ret = regmap_read(infracfg, INFRA_TOPAXI_PROTECTSTA1, &val);
++ if (ret)
++ return ret;
++
++ if ((val & mask) == mask)
++ break;
++
++ cpu_relax();
++ if (time_after(jiffies, expired))
++ return -EIO;
++ }
++
++ return 0;
++}
++
++/**
++ * mtk_infracfg_clear_bus_protection - disable bus protection
++ * @regmap: The infracfg regmap
++ * @mask: The mask containing the protection bits to be disabled.
++ *
++ * This function disables the bus protection bits previously enabled with
++ * mtk_infracfg_set_bus_protection.
++ */
++int mtk_infracfg_clear_bus_protection(struct regmap *infracfg, u32 mask)
++{
++ unsigned long expired;
++ int ret;
++
++ regmap_update_bits(infracfg, INFRA_TOPAXI_PROTECTEN, mask, 0);
++
++ expired = jiffies + HZ;
++
++ while (1) {
++ u32 val;
++
++ ret = regmap_read(infracfg, INFRA_TOPAXI_PROTECTSTA1, &val);
++ if (ret)
++ return ret;
++
++ if (!(val & mask))
++ break;
++
++ cpu_relax();
++ if (time_after(jiffies, expired))
++ return -EIO;
++ }
++
++ return 0;
++}
+diff --git a/include/linux/soc/mediatek/infracfg.h b/include/linux/soc/mediatek/infracfg.h
+new file mode 100644
+index 0000000..a5714e9
+--- /dev/null
++++ b/include/linux/soc/mediatek/infracfg.h
+@@ -0,0 +1,26 @@
++#ifndef __SOC_MEDIATEK_INFRACFG_H
++#define __SOC_MEDIATEK_INFRACFG_H
++
++#define MT8173_TOP_AXI_PROT_EN_MCI_M2 BIT(0)
++#define MT8173_TOP_AXI_PROT_EN_MM_M0 BIT(1)
++#define MT8173_TOP_AXI_PROT_EN_MM_M1 BIT(2)
++#define MT8173_TOP_AXI_PROT_EN_MMAPB_S BIT(6)
++#define MT8173_TOP_AXI_PROT_EN_L2C_M2 BIT(9)
++#define MT8173_TOP_AXI_PROT_EN_L2SS_SMI BIT(11)
++#define MT8173_TOP_AXI_PROT_EN_L2SS_ADD BIT(12)
++#define MT8173_TOP_AXI_PROT_EN_CCI_M2 BIT(13)
++#define MT8173_TOP_AXI_PROT_EN_MFG_S BIT(14)
++#define MT8173_TOP_AXI_PROT_EN_PERI_M0 BIT(15)
++#define MT8173_TOP_AXI_PROT_EN_PERI_M1 BIT(16)
++#define MT8173_TOP_AXI_PROT_EN_DEBUGSYS BIT(17)
++#define MT8173_TOP_AXI_PROT_EN_CQ_DMA BIT(18)
++#define MT8173_TOP_AXI_PROT_EN_GCPU BIT(19)
++#define MT8173_TOP_AXI_PROT_EN_IOMMU BIT(20)
++#define MT8173_TOP_AXI_PROT_EN_MFG_M0 BIT(21)
++#define MT8173_TOP_AXI_PROT_EN_MFG_M1 BIT(22)
++#define MT8173_TOP_AXI_PROT_EN_MFG_SNOOP_OUT BIT(23)
++
++int mtk_infracfg_set_bus_protection(struct regmap *infracfg, u32 mask);
++int mtk_infracfg_clear_bus_protection(struct regmap *infracfg, u32 mask);
++
++#endif /* __SOC_MEDIATEK_INFRACFG_H */
+--
+1.7.10.4
+