From 2f31555896f0f7e8be593298283473fc908975a7 Mon Sep 17 00:00:00 2001 From: Shunhua Lan Date: Tue, 4 Apr 2023 16:19:41 +0800 Subject: [PATCH 1/3] media: rockchip: hdmirx: do not create hdmirx_class Signed-off-by: Shunhua Lan Change-Id: I9f0cee966c89c0251ff1b1faa65208681329f014 --- drivers/media/platform/rockchip/hdmirx/rk_hdmirx.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/drivers/media/platform/rockchip/hdmirx/rk_hdmirx.c b/drivers/media/platform/rockchip/hdmirx/rk_hdmirx.c index 1390989518f1..1d745b49da5c 100644 --- a/drivers/media/platform/rockchip/hdmirx/rk_hdmirx.c +++ b/drivers/media/platform/rockchip/hdmirx/rk_hdmirx.c @@ -45,11 +45,11 @@ #include #include #include +#include #include "rk_hdmirx.h" #include "rk_hdmirx_cec.h" #include "rk_hdmirx_hdcp.h" -static struct class *hdmirx_class; static int debug; module_param(debug, int, 0644); MODULE_PARM_DESC(debug, "debug level (0-3)"); @@ -4297,7 +4297,7 @@ static int hdmirx_probe(struct platform_device *pdev) if (ret) goto err_unreg_video_dev; - hdmirx_dev->classdev = device_create_with_groups(hdmirx_class, + hdmirx_dev->classdev = device_create_with_groups(rk_hdmirx_class(), dev, MKDEV(0, 0), hdmirx_dev, hdmirx_groups, @@ -4455,9 +4455,6 @@ static struct platform_driver hdmirx_driver = { static int __init hdmirx_init(void) { - hdmirx_class = class_create(THIS_MODULE, "hdmirx"); - if (IS_ERR(hdmirx_class)) - return PTR_ERR(hdmirx_class); return platform_driver_register(&hdmirx_driver); } module_init(hdmirx_init); @@ -4465,7 +4462,6 @@ module_init(hdmirx_init); static void __exit hdmirx_exit(void) { platform_driver_unregister(&hdmirx_driver); - class_destroy(hdmirx_class); } module_exit(hdmirx_exit); From d40268f32a0c4ee217d3f76e7276bbff2f9841fb Mon Sep 17 00:00:00 2001 From: Shunhua Lan Date: Mon, 11 Sep 2023 17:21:30 +0800 Subject: [PATCH 2/3] media: i2c: rk628: add hdmirx device attribute Signed-off-by: Shunhua Lan Change-Id: If4a57926e6aaf85e9c636bf5af481249ef4720fa --- drivers/media/i2c/rk628/Kconfig | 1 + drivers/media/i2c/rk628/rk628_csi_v4l2.c | 40 ++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/drivers/media/i2c/rk628/Kconfig b/drivers/media/i2c/rk628/Kconfig index 98894a0106dc..b433e5084ff0 100644 --- a/drivers/media/i2c/rk628/Kconfig +++ b/drivers/media/i2c/rk628/Kconfig @@ -13,6 +13,7 @@ config VIDEO_RK628_CSI select HDMI select V4L2_FWNODE select VIDEO_RK628 + select VIDEO_ROCKCHIP_HDMIRX_CLASS help Support for the Rockchip RK628 HDMI to MIPI CSI-2 bridge. diff --git a/drivers/media/i2c/rk628/rk628_csi_v4l2.c b/drivers/media/i2c/rk628/rk628_csi_v4l2.c index 4fe67b3d58f9..2142676205ca 100644 --- a/drivers/media/i2c/rk628/rk628_csi_v4l2.c +++ b/drivers/media/i2c/rk628/rk628_csi_v4l2.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -132,6 +133,7 @@ struct rk628_csi { struct rk628_combtxphy *txphy; struct rk628_dsi dsi; const struct rk628_plat_data *plat_data; + struct device *classdev; }; struct rk628_csi_mode { @@ -2112,6 +2114,36 @@ static const struct of_device_id rk628_csi_of_match[] = { }; MODULE_DEVICE_TABLE(of, rk628_csi_of_match); +static bool tx_5v_power_present(struct v4l2_subdev *sd); + +static ssize_t audio_rate_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct rk628_csi *csi = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%d", rk628_hdmirx_audio_fs(csi->audio_info)); +} + +static ssize_t audio_present_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct rk628_csi *csi = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%d", + tx_5v_power_present(&csi->sd) ? + rk628_hdmirx_audio_present(csi->audio_info) : 0); +} + +static DEVICE_ATTR_RO(audio_rate); +static DEVICE_ATTR_RO(audio_present); + +static struct attribute *rk628_attrs[] = { + &dev_attr_audio_rate.attr, + &dev_attr_audio_present.attr, + NULL +}; +ATTRIBUTE_GROUPS(rk628); + static int rk628_csi_probe(struct i2c_client *client, const struct i2c_device_id *id) { @@ -2256,6 +2288,14 @@ static int rk628_csi_probe(struct i2c_client *client, goto err_hdl; } + csi->classdev = device_create_with_groups(rk_hdmirx_class(), + dev, MKDEV(0, 0), + csi, + rk628_groups, + "rk628"); + if (IS_ERR(csi->classdev)) + goto err_hdl; + INIT_DELAYED_WORK(&csi->delayed_work_enable_hotplug, rk628_csi_delayed_work_enable_hotplug); INIT_DELAYED_WORK(&csi->delayed_work_res_change, From 6e85806bc9b570448a51a4bb11ad0338c7ad2765 Mon Sep 17 00:00:00 2001 From: Shunhua Lan Date: Mon, 6 Feb 2023 16:52:55 +0800 Subject: [PATCH 3/3] media: i2c: lt6911uxc: create hdmirx_class devices Signed-off-by: Shunhua Lan Change-Id: I61c840d812b88554aa154bfc7c1435e1345d287e --- drivers/media/i2c/Kconfig | 1 + drivers/media/i2c/lt6911uxc.c | 38 +++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig index e21eb116d351..b3cd4efc9d6a 100644 --- a/drivers/media/i2c/Kconfig +++ b/drivers/media/i2c/Kconfig @@ -362,6 +362,7 @@ config VIDEO_LT6911UXC depends on VIDEO_V4L2 && I2C && VIDEO_V4L2_SUBDEV_API select HDMI select V4L2_FWNODE + select VIDEO_ROCKCHIP_HDMIRX_CLASS help Support for the Lontium LT6911UXC series HDMI to MIPI CSI-2 bridge. diff --git a/drivers/media/i2c/lt6911uxc.c b/drivers/media/i2c/lt6911uxc.c index 23da66e26ac7..c801d293ecae 100644 --- a/drivers/media/i2c/lt6911uxc.c +++ b/drivers/media/i2c/lt6911uxc.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -89,6 +90,7 @@ struct lt6911uxc { u32 module_index; u32 csi_lanes_in_use; u32 audio_sampling_rate; + struct device *classdev; }; struct lt6911uxc_mode { @@ -1279,6 +1281,34 @@ static inline int lt6911uxc_parse_of(struct lt6911uxc *lt6911uxc) } #endif +static ssize_t audio_rate_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct lt6911uxc *lt6911uxc = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%d", lt6911uxc->audio_sampling_rate); +} + +static ssize_t audio_present_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct lt6911uxc *lt6911uxc = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%d", + tx_5v_power_present(<6911uxc->sd) ? + lt6911uxc->is_audio_present : 0); +} + +static DEVICE_ATTR_RO(audio_rate); +static DEVICE_ATTR_RO(audio_present); + +static struct attribute *lt6911_attrs[] = { + &dev_attr_audio_rate.attr, + &dev_attr_audio_present.attr, + NULL +}; +ATTRIBUTE_GROUPS(lt6911); + static int lt6911uxc_probe(struct i2c_client *client, const struct i2c_device_id *id) { @@ -1355,6 +1385,14 @@ static int lt6911uxc_probe(struct i2c_client *client, goto err_clean_entity; } + lt6911uxc->classdev = device_create_with_groups(rk_hdmirx_class(), + dev, MKDEV(0, 0), + lt6911uxc, + lt6911_groups, + "lt6911"); + if (IS_ERR(lt6911uxc->classdev)) + goto err_clean_entity; + INIT_DELAYED_WORK(<6911uxc->delayed_work_enable_hotplug, lt6911uxc_delayed_work_enable_hotplug); INIT_DELAYED_WORK(<6911uxc->delayed_work_res_change,