|
@@ -1,7 +1,7 @@
|
|
|
/*
|
|
/*
|
|
|
* Samsung S5P/EXYNOS SoC series MIPI CSIS/DSIM DPHY driver
|
|
* Samsung S5P/EXYNOS SoC series MIPI CSIS/DSIM DPHY driver
|
|
|
*
|
|
*
|
|
|
- * Copyright (C) 2013 Samsung Electronics Co., Ltd.
|
|
|
|
|
|
|
+ * Copyright (C) 2013,2016 Samsung Electronics Co., Ltd.
|
|
|
* Author: Sylwester Nawrocki <s.nawrocki@samsung.com>
|
|
* Author: Sylwester Nawrocki <s.nawrocki@samsung.com>
|
|
|
*
|
|
*
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* This program is free software; you can redistribute it and/or modify
|
|
@@ -13,6 +13,7 @@
|
|
|
#include <linux/io.h>
|
|
#include <linux/io.h>
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/kernel.h>
|
|
|
#include <linux/mfd/syscon/exynos4-pmu.h>
|
|
#include <linux/mfd/syscon/exynos4-pmu.h>
|
|
|
|
|
+#include <linux/mfd/syscon/exynos5-pmu.h>
|
|
|
#include <linux/module.h>
|
|
#include <linux/module.h>
|
|
|
#include <linux/of.h>
|
|
#include <linux/of.h>
|
|
|
#include <linux/of_address.h>
|
|
#include <linux/of_address.h>
|
|
@@ -28,11 +29,15 @@ enum exynos_mipi_phy_id {
|
|
|
EXYNOS_MIPI_PHY_ID_DSIM0,
|
|
EXYNOS_MIPI_PHY_ID_DSIM0,
|
|
|
EXYNOS_MIPI_PHY_ID_CSIS1,
|
|
EXYNOS_MIPI_PHY_ID_CSIS1,
|
|
|
EXYNOS_MIPI_PHY_ID_DSIM1,
|
|
EXYNOS_MIPI_PHY_ID_DSIM1,
|
|
|
|
|
+ EXYNOS_MIPI_PHY_ID_CSIS2,
|
|
|
EXYNOS_MIPI_PHYS_NUM
|
|
EXYNOS_MIPI_PHYS_NUM
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
enum exynos_mipi_phy_regmap_id {
|
|
enum exynos_mipi_phy_regmap_id {
|
|
|
EXYNOS_MIPI_REGMAP_PMU,
|
|
EXYNOS_MIPI_REGMAP_PMU,
|
|
|
|
|
+ EXYNOS_MIPI_REGMAP_DISP,
|
|
|
|
|
+ EXYNOS_MIPI_REGMAP_CAM0,
|
|
|
|
|
+ EXYNOS_MIPI_REGMAP_CAM1,
|
|
|
EXYNOS_MIPI_REGMAPS_NUM
|
|
EXYNOS_MIPI_REGMAPS_NUM
|
|
|
};
|
|
};
|
|
|
|
|
|
|
@@ -96,6 +101,122 @@ static const struct mipi_phy_device_desc s5pv210_mipi_phy = {
|
|
|
},
|
|
},
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
+static const struct mipi_phy_device_desc exynos5420_mipi_phy = {
|
|
|
|
|
+ .num_regmaps = 1,
|
|
|
|
|
+ .regmap_names = {"syscon"},
|
|
|
|
|
+ .num_phys = 5,
|
|
|
|
|
+ .phys = {
|
|
|
|
|
+ {
|
|
|
|
|
+ /* EXYNOS_MIPI_PHY_ID_CSIS0 */
|
|
|
|
|
+ .coupled_phy_id = EXYNOS_MIPI_PHY_ID_DSIM0,
|
|
|
|
|
+ .enable_val = EXYNOS5_PHY_ENABLE,
|
|
|
|
|
+ .enable_reg = EXYNOS5420_MIPI_PHY0_CONTROL,
|
|
|
|
|
+ .enable_map = EXYNOS_MIPI_REGMAP_PMU,
|
|
|
|
|
+ .resetn_val = EXYNOS5_MIPI_PHY_S_RESETN,
|
|
|
|
|
+ .resetn_reg = EXYNOS5420_MIPI_PHY0_CONTROL,
|
|
|
|
|
+ .resetn_map = EXYNOS_MIPI_REGMAP_PMU,
|
|
|
|
|
+ }, {
|
|
|
|
|
+ /* EXYNOS_MIPI_PHY_ID_DSIM0 */
|
|
|
|
|
+ .coupled_phy_id = EXYNOS_MIPI_PHY_ID_CSIS0,
|
|
|
|
|
+ .enable_val = EXYNOS5_PHY_ENABLE,
|
|
|
|
|
+ .enable_reg = EXYNOS5420_MIPI_PHY0_CONTROL,
|
|
|
|
|
+ .enable_map = EXYNOS_MIPI_REGMAP_PMU,
|
|
|
|
|
+ .resetn_val = EXYNOS5_MIPI_PHY_M_RESETN,
|
|
|
|
|
+ .resetn_reg = EXYNOS5420_MIPI_PHY0_CONTROL,
|
|
|
|
|
+ .resetn_map = EXYNOS_MIPI_REGMAP_PMU,
|
|
|
|
|
+ }, {
|
|
|
|
|
+ /* EXYNOS_MIPI_PHY_ID_CSIS1 */
|
|
|
|
|
+ .coupled_phy_id = EXYNOS_MIPI_PHY_ID_DSIM1,
|
|
|
|
|
+ .enable_val = EXYNOS5_PHY_ENABLE,
|
|
|
|
|
+ .enable_reg = EXYNOS5420_MIPI_PHY1_CONTROL,
|
|
|
|
|
+ .enable_map = EXYNOS_MIPI_REGMAP_PMU,
|
|
|
|
|
+ .resetn_val = EXYNOS5_MIPI_PHY_S_RESETN,
|
|
|
|
|
+ .resetn_reg = EXYNOS5420_MIPI_PHY1_CONTROL,
|
|
|
|
|
+ .resetn_map = EXYNOS_MIPI_REGMAP_PMU,
|
|
|
|
|
+ }, {
|
|
|
|
|
+ /* EXYNOS_MIPI_PHY_ID_DSIM1 */
|
|
|
|
|
+ .coupled_phy_id = EXYNOS_MIPI_PHY_ID_CSIS1,
|
|
|
|
|
+ .enable_val = EXYNOS5_PHY_ENABLE,
|
|
|
|
|
+ .enable_reg = EXYNOS5420_MIPI_PHY1_CONTROL,
|
|
|
|
|
+ .enable_map = EXYNOS_MIPI_REGMAP_PMU,
|
|
|
|
|
+ .resetn_val = EXYNOS5_MIPI_PHY_M_RESETN,
|
|
|
|
|
+ .resetn_reg = EXYNOS5420_MIPI_PHY1_CONTROL,
|
|
|
|
|
+ .resetn_map = EXYNOS_MIPI_REGMAP_PMU,
|
|
|
|
|
+ }, {
|
|
|
|
|
+ /* EXYNOS_MIPI_PHY_ID_CSIS2 */
|
|
|
|
|
+ .coupled_phy_id = EXYNOS_MIPI_PHY_ID_NONE,
|
|
|
|
|
+ .enable_val = EXYNOS5_PHY_ENABLE,
|
|
|
|
|
+ .enable_reg = EXYNOS5420_MIPI_PHY2_CONTROL,
|
|
|
|
|
+ .enable_map = EXYNOS_MIPI_REGMAP_PMU,
|
|
|
|
|
+ .resetn_val = EXYNOS5_MIPI_PHY_S_RESETN,
|
|
|
|
|
+ .resetn_reg = EXYNOS5420_MIPI_PHY2_CONTROL,
|
|
|
|
|
+ .resetn_map = EXYNOS_MIPI_REGMAP_PMU,
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+#define EXYNOS5433_SYSREG_DISP_MIPI_PHY 0x100C
|
|
|
|
|
+#define EXYNOS5433_SYSREG_CAM0_MIPI_DPHY_CON 0x1014
|
|
|
|
|
+#define EXYNOS5433_SYSREG_CAM1_MIPI_DPHY_CON 0x1020
|
|
|
|
|
+
|
|
|
|
|
+static const struct mipi_phy_device_desc exynos5433_mipi_phy = {
|
|
|
|
|
+ .num_regmaps = 4,
|
|
|
|
|
+ .regmap_names = {
|
|
|
|
|
+ "samsung,pmu-syscon",
|
|
|
|
|
+ "samsung,disp-sysreg",
|
|
|
|
|
+ "samsung,cam0-sysreg",
|
|
|
|
|
+ "samsung,cam1-sysreg"
|
|
|
|
|
+ },
|
|
|
|
|
+ .num_phys = 5,
|
|
|
|
|
+ .phys = {
|
|
|
|
|
+ {
|
|
|
|
|
+ /* EXYNOS_MIPI_PHY_ID_CSIS0 */
|
|
|
|
|
+ .coupled_phy_id = EXYNOS_MIPI_PHY_ID_DSIM0,
|
|
|
|
|
+ .enable_val = EXYNOS5_PHY_ENABLE,
|
|
|
|
|
+ .enable_reg = EXYNOS5433_MIPI_PHY0_CONTROL,
|
|
|
|
|
+ .enable_map = EXYNOS_MIPI_REGMAP_PMU,
|
|
|
|
|
+ .resetn_val = BIT(0),
|
|
|
|
|
+ .resetn_reg = EXYNOS5433_SYSREG_CAM0_MIPI_DPHY_CON,
|
|
|
|
|
+ .resetn_map = EXYNOS_MIPI_REGMAP_CAM0,
|
|
|
|
|
+ }, {
|
|
|
|
|
+ /* EXYNOS_MIPI_PHY_ID_DSIM0 */
|
|
|
|
|
+ .coupled_phy_id = EXYNOS_MIPI_PHY_ID_CSIS0,
|
|
|
|
|
+ .enable_val = EXYNOS5_PHY_ENABLE,
|
|
|
|
|
+ .enable_reg = EXYNOS5433_MIPI_PHY0_CONTROL,
|
|
|
|
|
+ .enable_map = EXYNOS_MIPI_REGMAP_PMU,
|
|
|
|
|
+ .resetn_val = BIT(0),
|
|
|
|
|
+ .resetn_reg = EXYNOS5433_SYSREG_DISP_MIPI_PHY,
|
|
|
|
|
+ .resetn_map = EXYNOS_MIPI_REGMAP_DISP,
|
|
|
|
|
+ }, {
|
|
|
|
|
+ /* EXYNOS_MIPI_PHY_ID_CSIS1 */
|
|
|
|
|
+ .coupled_phy_id = EXYNOS_MIPI_PHY_ID_NONE,
|
|
|
|
|
+ .enable_val = EXYNOS5_PHY_ENABLE,
|
|
|
|
|
+ .enable_reg = EXYNOS5433_MIPI_PHY1_CONTROL,
|
|
|
|
|
+ .enable_map = EXYNOS_MIPI_REGMAP_PMU,
|
|
|
|
|
+ .resetn_val = BIT(1),
|
|
|
|
|
+ .resetn_reg = EXYNOS5433_SYSREG_CAM0_MIPI_DPHY_CON,
|
|
|
|
|
+ .resetn_map = EXYNOS_MIPI_REGMAP_CAM0,
|
|
|
|
|
+ }, {
|
|
|
|
|
+ /* EXYNOS_MIPI_PHY_ID_DSIM1 */
|
|
|
|
|
+ .coupled_phy_id = EXYNOS_MIPI_PHY_ID_NONE,
|
|
|
|
|
+ .enable_val = EXYNOS5_PHY_ENABLE,
|
|
|
|
|
+ .enable_reg = EXYNOS5433_MIPI_PHY1_CONTROL,
|
|
|
|
|
+ .enable_map = EXYNOS_MIPI_REGMAP_PMU,
|
|
|
|
|
+ .resetn_val = BIT(1),
|
|
|
|
|
+ .resetn_reg = EXYNOS5433_SYSREG_DISP_MIPI_PHY,
|
|
|
|
|
+ .resetn_map = EXYNOS_MIPI_REGMAP_DISP,
|
|
|
|
|
+ }, {
|
|
|
|
|
+ /* EXYNOS_MIPI_PHY_ID_CSIS2 */
|
|
|
|
|
+ .coupled_phy_id = EXYNOS_MIPI_PHY_ID_NONE,
|
|
|
|
|
+ .enable_val = EXYNOS5_PHY_ENABLE,
|
|
|
|
|
+ .enable_reg = EXYNOS5433_MIPI_PHY2_CONTROL,
|
|
|
|
|
+ .enable_map = EXYNOS_MIPI_REGMAP_PMU,
|
|
|
|
|
+ .resetn_val = BIT(0),
|
|
|
|
|
+ .resetn_reg = EXYNOS5433_SYSREG_CAM1_MIPI_DPHY_CON,
|
|
|
|
|
+ .resetn_map = EXYNOS_MIPI_REGMAP_CAM1,
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
struct exynos_mipi_video_phy {
|
|
struct exynos_mipi_video_phy {
|
|
|
struct regmap *regmaps[EXYNOS_MIPI_REGMAPS_NUM];
|
|
struct regmap *regmaps[EXYNOS_MIPI_REGMAPS_NUM];
|
|
@@ -241,6 +362,12 @@ static const struct of_device_id exynos_mipi_video_phy_of_match[] = {
|
|
|
{
|
|
{
|
|
|
.compatible = "samsung,s5pv210-mipi-video-phy",
|
|
.compatible = "samsung,s5pv210-mipi-video-phy",
|
|
|
.data = &s5pv210_mipi_phy,
|
|
.data = &s5pv210_mipi_phy,
|
|
|
|
|
+ }, {
|
|
|
|
|
+ .compatible = "samsung,exynos5420-mipi-video-phy",
|
|
|
|
|
+ .data = &exynos5420_mipi_phy,
|
|
|
|
|
+ }, {
|
|
|
|
|
+ .compatible = "samsung,exynos5433-mipi-video-phy",
|
|
|
|
|
+ .data = &exynos5433_mipi_phy,
|
|
|
},
|
|
},
|
|
|
{ /* sentinel */ },
|
|
{ /* sentinel */ },
|
|
|
};
|
|
};
|