Merge tag 'soc-3.15' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
Pull ARM SoC specific changes from Arnd Bergmann: "Lots of changes specific to one of the SoC families. Some that stick out are: - mach-qcom gains new features, most importantly SMP support for the newer chips (Stephen Boyd, Rohit Vaswani) - mvebu gains support for three new SoCs: Armada 375, 380 and 385 (Thomas Petazzoni and Free-electrons team) - SMP support for Rockchips (Heiko Stübner) - Lots of i.MX changes (Shawn Guo) - Added support for BCM5301x SoC (Hauke Mehrtens) - Multiplatform support for Marvell Kirkwood and Dove (Andrew Lunn and Sebastian Hesselbarth doing the final part of a long journey) - Unify davinci platforms and remove obsolete ones (Sekhar Nori, Arnd Bergmann)" * tag 'soc-3.15' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (126 commits) ARM: sunxi: Select HAVE_ARM_ARCH_TIMER ARM: cache-tauros2: remove ARMv6 code ARM: mvebu: don't select CONFIG_NEON ARM: davinci: fix DT booting with default defconfig ARM: configs: bcm_defconfig: enable bcm590xx regulator support ARM: davinci: remove tnetv107x support MAINTAINERS: Update ARM STi maintainers ARM: restrict BCM_KONA_UART to ARCH_BCM_MOBILE ARM: bcm21664: Add board support. ARM: sunxi: Add the new watchog compatibles to the reboot code ARM: enable ARM_HAS_SG_CHAIN for multiplatform ARM: davinci: remove da8xx_omapl_defconfig ARM: davinci: da8xx: fix multiple watchdog device registration ARM: davinci: add da8xx specific configs to davinci_all_defconfig ARM: davinci: enable da8xx build concurrently with older devices ARM: BCM5301X: workaround suppress fault ARM: BCM5301X: add early debugging support ARM: BCM5301X: initial support for the BCM5301X/BCM470X SoCs with ARM CPU ARM: mach-bcm: Remove GENERIC_TIME ARM: shmobile: APMU: Fix warnings due to improper printk formats ...
This commit is contained in:
@@ -11,6 +11,9 @@
|
||||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
struct imx_weim_devtype {
|
||||
unsigned int cs_count;
|
||||
@@ -56,6 +59,55 @@ static const struct of_device_id weim_id_table[] = {
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, weim_id_table);
|
||||
|
||||
static int __init imx_weim_gpr_setup(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
struct property *prop;
|
||||
const __be32 *p;
|
||||
struct regmap *gpr;
|
||||
u32 gprvals[4] = {
|
||||
05, /* CS0(128M) CS1(0M) CS2(0M) CS3(0M) */
|
||||
033, /* CS0(64M) CS1(64M) CS2(0M) CS3(0M) */
|
||||
0113, /* CS0(64M) CS1(32M) CS2(32M) CS3(0M) */
|
||||
01111, /* CS0(32M) CS1(32M) CS2(32M) CS3(32M) */
|
||||
};
|
||||
u32 gprval = 0;
|
||||
u32 val;
|
||||
int cs = 0;
|
||||
int i = 0;
|
||||
|
||||
gpr = syscon_regmap_lookup_by_phandle(np, "fsl,weim-cs-gpr");
|
||||
if (IS_ERR(gpr)) {
|
||||
dev_dbg(&pdev->dev, "failed to find weim-cs-gpr\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
of_property_for_each_u32(np, "ranges", prop, p, val) {
|
||||
if (i % 4 == 0) {
|
||||
cs = val;
|
||||
} else if (i % 4 == 3 && val) {
|
||||
val = (val / SZ_32M) | 1;
|
||||
gprval |= val << cs * 3;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
if (i == 0 || i % 4)
|
||||
goto err;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(gprvals); i++) {
|
||||
if (gprval == gprvals[i]) {
|
||||
/* Found it. Set up IOMUXC_GPR1[11:0] with it. */
|
||||
regmap_update_bits(gpr, IOMUXC_GPR1, 0xfff, gprval);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
err:
|
||||
dev_err(&pdev->dev, "Invalid 'ranges' configuration\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Parse and set the timing for this device. */
|
||||
static int __init weim_timing_setup(struct device_node *np, void __iomem *base,
|
||||
const struct imx_weim_devtype *devtype)
|
||||
@@ -92,6 +144,12 @@ static int __init weim_parse_dt(struct platform_device *pdev,
|
||||
struct device_node *child;
|
||||
int ret;
|
||||
|
||||
if (devtype == &imx50_weim_devtype) {
|
||||
ret = imx_weim_gpr_setup(pdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
for_each_child_of_node(pdev->dev.of_node, child) {
|
||||
if (!child->name)
|
||||
continue;
|
||||
|
Reference in New Issue
Block a user