From e5c8e1cc2f04b9adb2a45f3207eeb925214daf86 Mon Sep 17 00:00:00 2001 From: Jason Zhang Date: Wed, 8 May 2024 20:30:06 +0800 Subject: [PATCH] media: i2c: rk628: add attributes for enabling HDMI ARC This patch adds attributes for enabling HDMI ARC. Signed-off-by: Jason Zhang Change-Id: Iec7e1169efc65f298e5b5449e3803151d91c7258 --- drivers/media/i2c/rk628/rk628_csi_v4l2.c | 36 ++++++++++++++++++++++++ drivers/media/i2c/rk628/rk628_hdmirx.c | 23 +++++++++++++++ drivers/media/i2c/rk628/rk628_hdmirx.h | 2 ++ 3 files changed, 61 insertions(+) diff --git a/drivers/media/i2c/rk628/rk628_csi_v4l2.c b/drivers/media/i2c/rk628/rk628_csi_v4l2.c index 5a81de8e14c6..8d33f3b28ae2 100644 --- a/drivers/media/i2c/rk628/rk628_csi_v4l2.c +++ b/drivers/media/i2c/rk628/rk628_csi_v4l2.c @@ -3132,12 +3132,48 @@ static ssize_t audio_present_show(struct device *dev, rk628_hdmirx_audio_present(csi->audio_info) : 0); } +static ssize_t arc_enable_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct rk628_csi *csi = dev_get_drvdata(dev); + struct rk_hdmirx_dev *hdmirx_dev = dev_get_drvdata(dev); + + if (!hdmirx_dev) + return -EINVAL; + + return snprintf(buf, PAGE_SIZE, "%d\n", + rk628_hdmirx_get_arc_enable(csi->audio_info) ? 1 : 0); +} + +static ssize_t arc_enable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct rk628_csi *csi = dev_get_drvdata(dev); + struct rk_hdmirx_dev *hdmirx_dev = dev_get_drvdata(dev); + bool enabled; + int ret; + + if (!hdmirx_dev) + return -EINVAL; + + ret = kstrtobool(buf, &enabled); + if (ret) + return ret; + + rk628_hdmirx_set_arc_enable(csi->audio_info, enabled); + + return count; +} + static DEVICE_ATTR_RO(audio_rate); static DEVICE_ATTR_RO(audio_present); +static DEVICE_ATTR_RW(arc_enable); static struct attribute *rk628_attrs[] = { &dev_attr_audio_rate.attr, &dev_attr_audio_present.attr, + &dev_attr_arc_enable.attr, NULL }; ATTRIBUTE_GROUPS(rk628); diff --git a/drivers/media/i2c/rk628/rk628_hdmirx.c b/drivers/media/i2c/rk628/rk628_hdmirx.c index ef69600a5340..72a0ddada9d2 100644 --- a/drivers/media/i2c/rk628/rk628_hdmirx.c +++ b/drivers/media/i2c/rk628/rk628_hdmirx.c @@ -42,6 +42,7 @@ struct rk628_audioinfo { bool fifo_ints_en; bool ctsn_ints_en; bool audio_present; + bool arc_en; struct device *dev; }; @@ -639,6 +640,28 @@ int rk628_hdmirx_audio_fs(HAUDINFO info) } EXPORT_SYMBOL(rk628_hdmirx_audio_fs); +bool rk628_hdmirx_get_arc_enable(HAUDINFO info) +{ + struct rk628_audioinfo *aif = (struct rk628_audioinfo *)info; + + if (!aif) + return false; + + return aif->arc_en; +} +EXPORT_SYMBOL(rk628_hdmirx_get_arc_enable); + +int rk628_hdmirx_set_arc_enable(HAUDINFO info, bool enabled) +{ + struct rk628_audioinfo *aif = (struct rk628_audioinfo *)info; + + if (!aif) + return false; + + return aif->arc_en = enabled; +} +EXPORT_SYMBOL(rk628_hdmirx_set_arc_enable); + void rk628_hdmirx_audio_i2s_ctrl(HAUDINFO info, bool enable) { struct rk628_audioinfo *aif = (struct rk628_audioinfo *)info; diff --git a/drivers/media/i2c/rk628/rk628_hdmirx.h b/drivers/media/i2c/rk628/rk628_hdmirx.h index 1f0a302a75a8..15538e8ab6bf 100644 --- a/drivers/media/i2c/rk628/rk628_hdmirx.h +++ b/drivers/media/i2c/rk628/rk628_hdmirx.h @@ -504,6 +504,8 @@ void rk628_hdmirx_audio_cancel_work_rate_change(HAUDINFO info, bool sync); bool rk628_hdmirx_audio_present(HAUDINFO info); int rk628_hdmirx_audio_fs(HAUDINFO info); void rk628_hdmirx_audio_i2s_ctrl(HAUDINFO info, bool enable); +bool rk628_hdmirx_get_arc_enable(HAUDINFO info); +int rk628_hdmirx_set_arc_enable(HAUDINFO info, bool enabled); /* for audio isr process */ bool rk628_audio_fifoints_enabled(HAUDINFO info);