diff options
author | Anton Arapov <anton@redhat.com> | 2012-08-07 11:21:50 +0200 |
---|---|---|
committer | Anton Arapov <anton@redhat.com> | 2012-08-07 12:52:25 +0200 |
commit | 1d44b6f3fcf6058fb7c960b7558766967e8028f7 (patch) | |
tree | 53d88547c973ba048d233091a3f91f3173ad01df /arch/arm/plat-samsung/setup-mipiphy.c | |
parent | d91eda5d7b0383e6a0c83e0146ff141ff3b1355b (diff) | |
download | kernel-uprobes-1d44b6f3fcf6058fb7c960b7558766967e8028f7.tar.gz kernel-uprobes-1d44b6f3fcf6058fb7c960b7558766967e8028f7.tar.xz kernel-uprobes-1d44b6f3fcf6058fb7c960b7558766967e8028f7.zip |
fedora kernel: 222b075b3ff0d9e88aa9353e3c80667756ed7361v3.5.0-4
Signed-off-by: Anton Arapov <anton@redhat.com>
Diffstat (limited to 'arch/arm/plat-samsung/setup-mipiphy.c')
-rw-r--r-- | arch/arm/plat-samsung/setup-mipiphy.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/arch/arm/plat-samsung/setup-mipiphy.c b/arch/arm/plat-samsung/setup-mipiphy.c new file mode 100644 index 00000000000..683c466c0e6 --- /dev/null +++ b/arch/arm/plat-samsung/setup-mipiphy.c @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2011 Samsung Electronics Co., Ltd. + * + * S5P - Helper functions for MIPI-CSIS and MIPI-DSIM D-PHY control + * + * 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. + */ + +#include <linux/kernel.h> +#include <linux/platform_device.h> +#include <linux/io.h> +#include <linux/spinlock.h> +#include <mach/regs-clock.h> + +static int __s5p_mipi_phy_control(struct platform_device *pdev, + bool on, u32 reset) +{ + static DEFINE_SPINLOCK(lock); + void __iomem *addr; + unsigned long flags; + int pid; + u32 cfg; + + if (!pdev) + return -EINVAL; + + pid = (pdev->id == -1) ? 0 : pdev->id; + + if (pid != 0 && pid != 1) + return -EINVAL; + + addr = S5P_MIPI_DPHY_CONTROL(pid); + + spin_lock_irqsave(&lock, flags); + + cfg = __raw_readl(addr); + cfg = on ? (cfg | reset) : (cfg & ~reset); + __raw_writel(cfg, addr); + + if (on) { + cfg |= S5P_MIPI_DPHY_ENABLE; + } else if (!(cfg & (S5P_MIPI_DPHY_SRESETN | + S5P_MIPI_DPHY_MRESETN) & ~reset)) { + cfg &= ~S5P_MIPI_DPHY_ENABLE; + } + + __raw_writel(cfg, addr); + spin_unlock_irqrestore(&lock, flags); + + return 0; +} + +int s5p_csis_phy_enable(struct platform_device *pdev, bool on) +{ + return __s5p_mipi_phy_control(pdev, on, S5P_MIPI_DPHY_SRESETN); +} + +int s5p_dsim_phy_enable(struct platform_device *pdev, bool on) +{ + return __s5p_mipi_phy_control(pdev, on, S5P_MIPI_DPHY_MRESETN); +} |