From c046c0246799c56f1b5cc88d8320f74aff06165f Mon Sep 17 00:00:00 2001 From: Algea Cao Date: Tue, 17 Oct 2023 18:27:20 +0800 Subject: [PATCH] misc: rk628: Supports different versions of the rk628 Signed-off-by: Algea Cao Signed-off-by: Guochun Huang Change-Id: I7f5102a81648abbacfbd90caf3e186649e219d2b --- drivers/misc/rk628/rk628.c | 41 +++++++++++++++++++++++++++++++------- drivers/misc/rk628/rk628.h | 9 +++++++-- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/drivers/misc/rk628/rk628.c b/drivers/misc/rk628/rk628.c index cddf874263c6..8ceef76a3cf4 100644 --- a/drivers/misc/rk628/rk628.c +++ b/drivers/misc/rk628/rk628.c @@ -1087,6 +1087,34 @@ static const struct file_operations rk628_debugfs_summary_fops = { }; +static int rk628_version_info(struct rk628 *rk628) +{ + int ret; + char *version; + + ret = rk628_i2c_read(rk628, GRF_SOC_VERSION, &rk628->version); + if (ret) { + dev_err(rk628->dev, "failed to access register: %d\n", ret); + return ret; + } + + switch (rk628->version) { + case RK628D_VERSION: + version = "D/E"; + break; + case RK628F_VERSION: + version = "F/H"; + break; + default: + version = "unknown"; + ret = -EINVAL; + } + + dev_info(rk628->dev, "the driver version is %s of RK628-%s\n", DRIVER_VERSION, version); + + return ret; +} + static int rk628_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { @@ -1097,8 +1125,6 @@ rk628_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) unsigned long irq_flags; struct dentry *debug_dir; - dev_info(dev, "RK628 misc driver version: %s\n", DRIVER_VERSION); - rk628 = devm_kzalloc(dev, sizeof(*rk628), GFP_KERNEL); if (!rk628) return -ENOMEM; @@ -1174,17 +1200,18 @@ rk628_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) } } - /* selete int io function */ - ret = rk628_i2c_write(rk628, GRF_GPIO3AB_SEL_CON, 0x30002000); - if (ret) { - dev_err(dev, "failed to access register: %d\n", ret); + ret = rk628_version_info(rk628); + if (ret) return ret; - } + + /* select int io function */ + rk628_i2c_write(rk628, GRF_GPIO3AB_SEL_CON, 0x30002000); #ifdef CONFIG_FB rk628->fb_nb.notifier_call = rk628_fb_notifier_callback; fb_register_client(&rk628->fb_nb); #endif + rk628->monitor_wq = alloc_ordered_workqueue("%s", WQ_MEM_RECLAIM | WQ_FREEZABLE, "rk628-monitor-wq"); INIT_DELAYED_WORK(&rk628->delay_work, rk628_display_work); diff --git a/drivers/misc/rk628/rk628.h b/drivers/misc/rk628/rk628.h index 526f74d74860..6e22425375ae 100644 --- a/drivers/misc/rk628/rk628.h +++ b/drivers/misc/rk628/rk628.h @@ -19,7 +19,7 @@ #include #include -#define DRIVER_VERSION "0.0.1" +#define DRIVER_VERSION "0.1.0" #define UPDATE(x, h, l) (((x) << (l)) & GENMASK((h), (l))) #define HIWORD_UPDATE(v, h, l) ((((v) << (l)) & GENMASK((h), (l))) | \ (GENMASK((h), (l)) << 16)) @@ -180,6 +180,7 @@ #define GRF_GPIO3A_D1_CON 0x00e4 #define GRF_GPIO3B_D_CON 0x00e8 #define GRF_GPIO_SR_CON 0x00ec +#define GRF_SW_HDMIRXPHY_CRTL 0x00f4 #define GRF_INTR0_EN 0x0100 #define GRF_INTR0_CLR_EN 0x0104 #define GRF_INTR0_STATUS 0x0108 @@ -197,7 +198,7 @@ #define GRF_OS_REG1 0x0144 #define GRF_OS_REG2 0x0148 #define GRF_OS_REG3 0x014c -#define GRF_SOC_VERSION 0x0150 +#define GRF_SOC_VERSION 0x0200 #define GRF_MAX_REGISTER GRF_SOC_VERSION #define DRM_MODE_FLAG_PHSYNC (1<<0) @@ -205,6 +206,9 @@ #define DRM_MODE_FLAG_PVSYNC (1<<2) #define DRM_MODE_FLAG_NVSYNC (1<<3) +#define RK628D_VERSION 0x20200326 +#define RK628F_VERSION 0x20230321 + enum { COMBTXPHY_MODULEA_EN = BIT(0), COMBTXPHY_MODULEB_EN = BIT(1), @@ -454,6 +458,7 @@ struct rk628 { int sync_pol; void *csi; struct notifier_block fb_nb; + u32 version; }; static inline int rk628_i2c_write(struct rk628 *rk628, u32 reg, u32 val)