diff --git a/drivers/media/i2c/rk628/rk628.c b/drivers/media/i2c/rk628/rk628.c index c486773fb834..ba03abf3a680 100644 --- a/drivers/media/i2c/rk628/rk628.c +++ b/drivers/media/i2c/rk628/rk628.c @@ -18,6 +18,7 @@ #include "rk628_csi.h" #include "rk628_dsi.h" #include "rk628_hdmirx.h" +#include "rk628_post_process.h" static const struct regmap_range rk628_cru_readable_ranges[] = { regmap_reg_range(CRU_CPLL_CON0, CRU_CPLL_CON4), @@ -493,6 +494,7 @@ void rk628_debugfs_create(struct rk628 *rk628) rk628_debugfs_register_create(rk628); rk628_dbg_en_node(rk628); + rk628_post_process_pattern_node(rk628); } EXPORT_SYMBOL(rk628_debugfs_create); diff --git a/drivers/media/i2c/rk628/rk628.h b/drivers/media/i2c/rk628/rk628.h index 7d693ff8fc8d..d3fc15ea4ca5 100644 --- a/drivers/media/i2c/rk628/rk628.h +++ b/drivers/media/i2c/rk628/rk628.h @@ -52,6 +52,8 @@ #define GRF_AS_DSIPHY_MASK BIT(0) #define GRF_AS_DSIPHY(x) UPDATE(x, 0, 0) #define GRF_SCALER_CON0 0x0010 +#define SCL_COLOR_VER_EN(x) HIWORD_UPDATE(x, 10, 10) +#define SCL_COLOR_BAR_EN(x) HIWORD_UPDATE(x, 9, 9) #define SCL_VER_DOWN_MODE(x) HIWORD_UPDATE(x, 8, 8) #define SCL_HOR_DOWN_MODE(x) HIWORD_UPDATE(x, 7, 7) #define SCL_BIC_COE_SEL(x) HIWORD_UPDATE(x, 6, 5) diff --git a/drivers/media/i2c/rk628/rk628_post_process.c b/drivers/media/i2c/rk628/rk628_post_process.c index 97bdc4125047..f60a0e0154c2 100644 --- a/drivers/media/i2c/rk628/rk628_post_process.c +++ b/drivers/media/i2c/rk628/rk628_post_process.c @@ -1659,6 +1659,65 @@ static void rk628_post_process_csc(struct rk628 *rk628, bool is_output_full_rang } } +static int rk628_scaler_color_bar_show(struct seq_file *s, void *data) +{ + seq_puts(s, " Enable horizontal color bar:\n"); + seq_puts(s, " example: echo 1 > /sys/kernel/debug/rk628/5-0050/scaler_color_bar\n"); + seq_puts(s, " Enable vertical color bar:\n"); + seq_puts(s, " example: echo 2 > /sys/kernel/debug/rk628/5-0050/scaler_color_bar\n"); + seq_puts(s, " Disable color bar:\n"); + seq_puts(s, " example: echo 0 > /sys/kernel/debug/rk628/5-0050/scaler_color_bar\n"); + + return 0; +} + +static int rk628_scaler_color_bar_open(struct inode *inode, struct file *file) +{ + return single_open(file, rk628_scaler_color_bar_show, inode->i_private); +} + +static ssize_t rk628_scaler_color_bar_write(struct file *file, const char __user *ubuf, + size_t len, loff_t *offp) +{ + struct rk628 *rk628 = ((struct seq_file *)file->private_data)->private; + u8 mode; + + if (kstrtou8_from_user(ubuf, len, 0, &mode)) + return -EFAULT; + + switch (mode) { + case 0: + rk628_i2c_write(rk628, GRF_SCALER_CON0, SCL_COLOR_BAR_EN(0)); + break; + case 1: + rk628_i2c_write(rk628, GRF_SCALER_CON0, SCL_COLOR_BAR_EN(1)); + rk628_i2c_write(rk628, GRF_SCALER_CON0, SCL_COLOR_VER_EN(0)); + break; + case 2: + default: + rk628_i2c_write(rk628, GRF_SCALER_CON0, SCL_COLOR_BAR_EN(1)); + rk628_i2c_write(rk628, GRF_SCALER_CON0, SCL_COLOR_VER_EN(1)); + } + + return len; +} + +static const struct file_operations rk628_scaler_color_bar_fops = { + .owner = THIS_MODULE, + .open = rk628_scaler_color_bar_open, + .read = seq_read, + .write = rk628_scaler_color_bar_write, + .llseek = seq_lseek, + .release = single_release, +}; + +void rk628_post_process_pattern_node(struct rk628 *rk628) +{ + debugfs_create_file("scaler_color_bar", 0600, rk628->debug_dir, + rk628, &rk628_scaler_color_bar_fops); +} +EXPORT_SYMBOL(rk628_post_process_pattern_node); + void rk628_post_process_csc_en(struct rk628 *rk628, bool output_full_range) { rk628_post_process_csc(rk628, output_full_range); diff --git a/drivers/media/i2c/rk628/rk628_post_process.h b/drivers/media/i2c/rk628/rk628_post_process.h index 6d4df6f8a4df..835f3657f379 100644 --- a/drivers/media/i2c/rk628/rk628_post_process.h +++ b/drivers/media/i2c/rk628/rk628_post_process.h @@ -9,5 +9,5 @@ void rk628_post_process_csc_en(struct rk628 *rk628, bool output_full_range); void rk628_post_process_csc_dis(struct rk628 *rk628); - +void rk628_post_process_pattern_node(struct rk628 *rk628); #endif