From: Marek Szyprowski Date: Fri, 7 Aug 2015 08:36:26 +0000 (+0200) Subject: fimc-is: Replace hard coded PMU register access with regmap calls X-Git-Tag: accepted/tizen/unified/20190330.030053~310 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=25ae26e6899f1b7b1b656cb5f08a153d813abd6d;p=platform%2Fkernel%2Flinux-exynos.git fimc-is: Replace hard coded PMU register access with regmap calls Change-Id: Ifa9cccbbe68ff937c5ade1539592f5db0876edfb Signed-off-by: Marek Szyprowski --- diff --git a/drivers/media/platform/exynos/fimc-is/fimc-is-core.h b/drivers/media/platform/exynos/fimc-is/fimc-is-core.h index 7d28be6..a73809d 100644 --- a/drivers/media/platform/exynos/fimc-is/fimc-is-core.h +++ b/drivers/media/platform/exynos/fimc-is/fimc-is-core.h @@ -224,6 +224,7 @@ struct fimc_is_core { struct platform_device *pdev; struct resource *regs_res; void __iomem *regs; + struct regmap *pmu_regmap; int irq; u32 id; u32 debug_cnt; diff --git a/drivers/media/platform/exynos/fimc-is/fimc-is-device-companion.c b/drivers/media/platform/exynos/fimc-is/fimc-is-device-companion.c index 553d289..d75a08e 100644 --- a/drivers/media/platform/exynos/fimc-is/fimc-is-device-companion.c +++ b/drivers/media/platform/exynos/fimc-is/fimc-is-device-companion.c @@ -451,7 +451,6 @@ p_err: int fimc_is_companion_close(struct fimc_is_device_companion *device) { int ret = 0; - u32 timeout; struct fimc_is_core *core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev); if (!core) { err("core is NULL"); @@ -468,7 +467,9 @@ int fimc_is_companion_close(struct fimc_is_device_companion *device) #if defined(CONFIG_PM_RUNTIME) pm_runtime_put_sync(&device->pdev->dev); +#if 0 if (core != NULL && !test_bit(FIMC_IS_ISCHAIN_POWER_ON, &core->state)) { + u32 timeout; warn("only companion device closing after open.."); timeout = 2000; while ((readl(PMUREG_CAM1_STATUS) & 0x1) && timeout) { @@ -481,6 +482,7 @@ int fimc_is_companion_close(struct fimc_is_device_companion *device) err("CAM1 power down failed(CAM1:0x%08x, A5:0x%08x)\n", readl(PMUREG_CAM1_STATUS), readl(PMUREG_ISP_ARM_STATUS)); } +#endif #else fimc_is_companion_runtime_suspend(&device->pdev->dev); #endif /* CONFIG_PM_RUNTIME */ diff --git a/drivers/media/platform/exynos/fimc-is/fimc-is-device-ischain.c b/drivers/media/platform/exynos/fimc-is/fimc-is-device-ischain.c index 98a6cee..a2ba7f5 100644 --- a/drivers/media/platform/exynos/fimc-is/fimc-is-device-ischain.c +++ b/drivers/media/platform/exynos/fimc-is/fimc-is-device-ischain.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -1204,9 +1205,11 @@ static int fimc_is_ischain_loadcalb(struct fimc_is_device_ischain *device, mwarn("calibration loading is success", device); return ret; } + static void fimc_is_ischain_forcedown(struct fimc_is_device_ischain *this, bool on) { +#if 0 if (on) { printk(KERN_INFO "Set low poweroff mode\n"); __raw_writel(0x0, PMUREG_ISP_ARM_OPTION); @@ -1218,29 +1221,48 @@ static void fimc_is_ischain_forcedown(struct fimc_is_device_ischain *this, __raw_writel(0x8, PMUREG_ISP_LOW_POWER_OFF); this->force_down = false; } +#endif } static void fimc_is_a5_power(struct device *dev, int power_flags) { - u32 timeout; + struct fimc_is_core *core; + int timeout; + u32 val; + + if (!fimc_is_dev) { + err("fimc_is_dev is not yet probed"); + BUG(); + } + + core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev); + if (!core) { + err("core is NULL"); + BUG(); + } /* configuration */ - __raw_writel(power_flags, PMUREG_ISP_ARM_CONFIGURATION); + regmap_write(core->pmu_regmap, PMUREG_ISP_ARM_CONFIGURATION, power_flags); /* option */ if (power_flags) { /* A5 enable[15] */ - writel((1 << 15), PMUREG_ISP_ARM_OPTION); + regmap_write(core->pmu_regmap, PMUREG_ISP_ARM_OPTION, (1 << 15)); } /* status */ timeout = 1000; - while ((__raw_readl(PMUREG_ISP_ARM_STATUS) & 0x1) != power_flags) { - if (timeout == 0) - err("%s can't control power(%d), timeout\n", __func__, power_flags); - timeout--; - udelay(1); + while (timeout) { + regmap_read(core->pmu_regmap, PMUREG_ISP_ARM_STATUS, &val); + if ((val & 0x1) != power_flags) { + timeout--; + udelay(1); + } else { + break; + } } + if (timeout == 0) + err("%s can't control power(%d), timeout\n", __func__, power_flags); } int fimc_is_ischain_power(struct fimc_is_device_ischain *device, int on) @@ -1331,7 +1353,8 @@ int fimc_is_ischain_power(struct fimc_is_device_ischain *device, int on) merr("secure configuration is fail[0x131E0004:%08X]", device, debug); /* To guarantee FW restart */ - if (__raw_readl(PMUREG_ISP_ARM_STATUS) & 0x1) { + regmap_read(core->pmu_regmap, PMUREG_ISP_ARM_STATUS, &val); + if (val & 0x1) { fimc_is_a5_power(dev, 0); } diff --git a/drivers/media/platform/exynos/fimc-is/fimc-is-dt.c b/drivers/media/platform/exynos/fimc-is/fimc-is-dt.c index 4ab888b..94069d1 100644 --- a/drivers/media/platform/exynos/fimc-is/fimc-is-dt.c +++ b/drivers/media/platform/exynos/fimc-is/fimc-is-dt.c @@ -16,6 +16,8 @@ #include #include #include +#include +#include #include "fimc-is-core.h" #include "fimc-is-dt.h" @@ -276,6 +278,10 @@ int fimc_is_parse_children_dt(struct device *dev, struct fimc_is_core *core) if (i >= 0 || i < FIMC_IS_MAX_NODES) core->csis_np[i] = child; } + + core->pmu_regmap = syscon_regmap_lookup_by_phandle(np, + "samsung,pmureg-phandle"); + return 0; } diff --git a/drivers/media/platform/exynos/fimc-is/fimc-is-hw-ischain.c b/drivers/media/platform/exynos/fimc-is/fimc-is-hw-ischain.c index 953e652..fb3dc98 100644 --- a/drivers/media/platform/exynos/fimc-is/fimc-is-hw-ischain.c +++ b/drivers/media/platform/exynos/fimc-is/fimc-is-hw-ischain.c @@ -30,6 +30,7 @@ int fimc_is_runtime_suspend_post(struct device *dev) { int ret = 0; +#if 0 u32 timeout; timeout = 2000; @@ -59,7 +60,7 @@ int fimc_is_runtime_suspend_post(struct device *dev) err("CAM1 power down failed(CAM1:0x%08x, A5:0x%08x)\n", readl(PMUREG_CAM1_STATUS), readl(PMUREG_ISP_ARM_STATUS)); - +#endif return ret; } diff --git a/drivers/media/platform/exynos/fimc-is/fimc-is-regs.h b/drivers/media/platform/exynos/fimc-is/fimc-is-regs.h index 7fa1a13..b12a194 100644 --- a/drivers/media/platform/exynos/fimc-is/fimc-is-regs.h +++ b/drivers/media/platform/exynos/fimc-is/fimc-is-regs.h @@ -339,19 +339,15 @@ #define ISSR62 (MCUCTL+0x178) #define ISSR63 (MCUCTL+0x17c) -#define PMUREG_ISP_ARM_CONFIGURATION (S5P_VA_PMU + 0x2580) -#define PMUREG_ISP_ARM_STATUS (S5P_VA_PMU + 0x2584) -#define PMUREG_ISP_ARM_OPTION (S5P_VA_PMU + 0x2588) -#define PMUREG_ISP_LOW_POWER_OFF (S5P_VA_PMU + 0x0004) -#define PMUREG_ISP_CONFIGURATION (S5P_VA_PMU + 0x4140) -#define PMUREG_ISP_STATUS (S5P_VA_PMU + 0x4144) - -#define PMUREG_CAM0_STATUS (S5P_VA_PMU + 0x4024) -#define PMUREG_CAM1_STATUS (S5P_VA_PMU + 0x40A4) +#define PMUREG_ISP_ARM_CONFIGURATION (0x2580) +#define PMUREG_ISP_ARM_STATUS (0x2584) +#define PMUREG_ISP_ARM_OPTION (0x2588) +#define PMUREG_ISP_LOW_POWER_OFF (0x0004) +#define PMUREG_ISP_CONFIGURATION (0x4140) +#define PMUREG_ISP_STATUS (0x4144) #define SYSREG_GSCBLK_CFG1 (S3C_VA_SYS + 0x0224) #define SYSREG_ISPBLK_CFG (S3C_VA_SYS + 0x022C) - /* GIC for FIMC-IS*/ #define PA_FIMC_IS_GIC_C (0x141E0000) #define PA_FIMC_IS_GIC_D (0x141F0000)