diff --git a/drivers/amlogic/iomap/iomap.c b/drivers/amlogic/iomap/iomap.c index 239183b24c6e..a11a4a631163 100644 --- a/drivers/amlogic/iomap/iomap.c +++ b/drivers/amlogic/iomap/iomap.c @@ -39,6 +39,8 @@ static const struct of_device_id iomap_dt_match[] = { static void __iomem *meson_reg_map[IO_BUS_MAX] = { NULL }; static uint meson_reg_max[IO_BUS_MAX] = { 0 }; +void __iomem *vpp_base; +unsigned int vpp_max; inline int aml_reg_read(u32 bus_type, unsigned int reg, unsigned int *val) { @@ -295,6 +297,10 @@ static int iomap_probe(struct platform_device *pdev) meson_reg_max[i] = res.end - res.start; i++; } + if (i > IO_VAPB_BUS_BASE) { + vpp_base = meson_reg_map[IO_VAPB_BUS_BASE]; + vpp_max = meson_reg_max[IO_VAPB_BUS_BASE]; + } pr_info("amlogic iomap probe done\n"); return 0; } diff --git a/drivers/amlogic/media/enhancement/amvecm/local_contrast.c b/drivers/amlogic/media/enhancement/amvecm/local_contrast.c index 75a627e845fb..c2be4742a500 100644 --- a/drivers/amlogic/media/enhancement/amvecm/local_contrast.c +++ b/drivers/amlogic/media/enhancement/amvecm/local_contrast.c @@ -14,7 +14,7 @@ * more details. * */ - +#define SKIP_IO_TRACE #include #include #include diff --git a/include/linux/amlogic/iomap.h b/include/linux/amlogic/iomap.h index 663ad76e8777..0127c6bef3ca 100644 --- a/include/linux/amlogic/iomap.h +++ b/include/linux/amlogic/iomap.h @@ -93,4 +93,37 @@ extern void aml_write_hiubus(unsigned int reg, unsigned int val); extern void aml_hiubus_update_bits(unsigned int reg, unsigned int mask, unsigned int val); + +#include +extern void __iomem *vpp_base; +extern uint vpp_max; + +static inline int aml_reg_vcbus_invalid(unsigned int reg) +{ + return !(vpp_base && (vpp_max >= reg)); +} + +static inline int aml_read_vcbus_s(unsigned int reg) +{ + return readl((vpp_base + (reg << 2))); +} + +static inline void aml_write_vcbus_s(unsigned int reg, unsigned int val) +{ + writel(val, (vpp_base + (reg << 2))); +} + +static inline void aml_vcbus_update_bits_s(unsigned int reg, unsigned int value, + unsigned int start, unsigned int len) +{ + unsigned int tmp, orig; + unsigned int mask = (((1L << len) - 1) << start); + int r = (reg << 2); + + orig = readl((vpp_base + r)); + tmp = orig & ~mask; + tmp |= (value << start) & mask; + writel(tmp, (vpp_base + r)); +} + #endif diff --git a/include/linux/amlogic/media/amvecm/amvecm.h b/include/linux/amlogic/media/amvecm/amvecm.h index 50b0f95921f3..fbb30cd8a99c 100644 --- a/include/linux/amlogic/media/amvecm/amvecm.h +++ b/include/linux/amlogic/media/amvecm/amvecm.h @@ -381,12 +381,12 @@ struct am_pq_parm_s { static inline void WRITE_VPP_REG(uint32_t reg, const uint32_t value) { - aml_write_vcbus(reg, value); + aml_write_vcbus_s(reg, value); } static inline uint32_t READ_VPP_REG(uint32_t reg) { - return aml_read_vcbus(reg); + return aml_read_vcbus_s(reg); } static inline void WRITE_VPP_REG_BITS(uint32_t reg, @@ -394,9 +394,7 @@ static inline void WRITE_VPP_REG_BITS(uint32_t reg, const uint32_t start, const uint32_t len) { - WRITE_VPP_REG(reg, ((READ_VPP_REG(reg) & - ~(((1L << (len)) - 1) << (start))) | - (((value) & ((1L << (len)) - 1)) << (start)))); + aml_vcbus_update_bits_s(reg, value, start, len); } static inline uint32_t READ_VPP_REG_BITS(uint32_t reg, @@ -405,7 +403,7 @@ static inline uint32_t READ_VPP_REG_BITS(uint32_t reg, { uint32_t val; - val = ((READ_VPP_REG(reg) >> (start)) & ((1L << (len)) - 1)); + val = ((aml_read_vcbus_s(reg) >> (start)) & ((1L << (len)) - 1)); return val; }