misc: rk628: Supports different versions of the rk628

Signed-off-by: Algea Cao <algea.cao@rock-chips.com>
Signed-off-by: Guochun Huang <hero.huang@rock-chips.com>
Change-Id: I7f5102a81648abbacfbd90caf3e186649e219d2b
This commit is contained in:
Algea Cao
2023-10-17 18:27:20 +08:00
committed by Tao Huang
parent bc81dfef6e
commit c046c02467
2 changed files with 41 additions and 9 deletions

View File

@@ -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);

View File

@@ -19,7 +19,7 @@
#include <linux/workqueue.h>
#include <linux/regulator/consumer.h>
#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)