| /* |
| * 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); |
| } |