diff --git a/drivers/media/i2c/rk628/rk628_bt1120_v4l2.c b/drivers/media/i2c/rk628/rk628_bt1120_v4l2.c index e6de0e5d3a71..67c350b811a5 100644 --- a/drivers/media/i2c/rk628/rk628_bt1120_v4l2.c +++ b/drivers/media/i2c/rk628/rk628_bt1120_v4l2.c @@ -2035,7 +2035,8 @@ static int rk628_bt1120_probe(struct i2c_client *client, bt1120->audio_info = rk628_hdmirx_audioinfo_alloc(dev, &bt1120->confctl_mutex, rk628, - bt1120->i2s_enable_default); + bt1120->i2s_enable_default, + NULL); if (!bt1120->audio_info) { v4l2_err(sd, "request audio info fail\n"); goto err_work_queues; diff --git a/drivers/media/i2c/rk628/rk628_csi_v4l2.c b/drivers/media/i2c/rk628/rk628_csi_v4l2.c index 9828d9c00475..2a53a1107c71 100644 --- a/drivers/media/i2c/rk628/rk628_csi_v4l2.c +++ b/drivers/media/i2c/rk628/rk628_csi_v4l2.c @@ -1846,6 +1846,8 @@ static int rk628_csi_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh, return v4l2_ctrl_subdev_subscribe_event(sd, fh, sub); case RK_HDMIRX_V4L2_EVENT_SIGNAL_LOST: return v4l2_event_subscribe(fh, sub, 0, NULL); + case RK_HDMIRX_V4L2_EVENT_AUDIOINFO: + return v4l2_event_subscribe(fh, sub, 0, NULL); default: return -EINVAL; } @@ -2940,6 +2942,17 @@ static irqreturn_t plugin_detect_irq(int irq, void *dev_id) return IRQ_HANDLED; } +static void rk628_csi_audio_info_cb(struct rk628 *rk628, bool on) +{ + struct i2c_client *client = to_i2c_client(rk628->dev); + struct v4l2_subdev *sd = i2c_get_clientdata(client); + + const struct v4l2_event evt_audio_info = { + .type = RK_HDMIRX_V4L2_EVENT_AUDIOINFO, + }; + v4l2_event_queue(sd->devnode, &evt_audio_info); +} + static int rk628_csi_power_on(struct rk628_csi *csi) { clk_prepare_enable(csi->soc_24M); @@ -3462,7 +3475,8 @@ static int rk628_csi_probe(struct i2c_client *client, csi->audio_info = rk628_hdmirx_audioinfo_alloc(dev, &csi->confctl_mutex, rk628, - csi->i2s_enable_default); + csi->i2s_enable_default, + rk628_csi_audio_info_cb); if (!csi->audio_info) { err = -ENOMEM; v4l2_err(sd, "request audio info fail\n"); diff --git a/drivers/media/i2c/rk628/rk628_hdmirx.c b/drivers/media/i2c/rk628/rk628_hdmirx.c index 0065a096237c..5af2cc8223bb 100644 --- a/drivers/media/i2c/rk628/rk628_hdmirx.c +++ b/drivers/media/i2c/rk628/rk628_hdmirx.c @@ -55,6 +55,7 @@ struct rk628_audioinfo { struct device *dev; struct platform_device *pdev; hdmi_codec_plugged_cb plugged_cb; + rk628_audio_info_cb info_cb; struct device *codec_dev; }; @@ -681,6 +682,8 @@ void rk628_hdmirx_audio_handle_plugged_change(HAUDINFO info, bool plugged) if (aif->plugged_cb && aif->codec_dev) aif->plugged_cb(aif->codec_dev, plugged); + if (aif->info_cb) + aif->info_cb(aif->rk628, plugged); } static int rk628_hdmirx_audio_hook_plugged_cb(struct device *dev, void *data, @@ -730,7 +733,8 @@ static int rk628_hdmirx_register_audio_device(struct rk628_audioinfo *aif) HAUDINFO rk628_hdmirx_audioinfo_alloc(struct device *dev, struct mutex *confctl_mutex, struct rk628 *rk628, - bool en) + bool en, + rk628_audio_info_cb info_cb) { struct rk628_audioinfo *aif; int ret; @@ -750,6 +754,7 @@ HAUDINFO rk628_hdmirx_audioinfo_alloc(struct device *dev, aif->i2s_enabled_default = en; aif->dev = dev; aif->audio_present = false; + aif->info_cb = info_cb; ret = rk628_hdmirx_register_audio_device(aif); if (ret) { dev_err(dev, "register audio_driver failed!\n"); diff --git a/drivers/media/i2c/rk628/rk628_hdmirx.h b/drivers/media/i2c/rk628/rk628_hdmirx.h index 55083a99827d..ed5c4c05ac01 100644 --- a/drivers/media/i2c/rk628/rk628_hdmirx.h +++ b/drivers/media/i2c/rk628/rk628_hdmirx.h @@ -497,10 +497,12 @@ void rk628_hdmirx_set_hdcp(struct rk628 *rk628, struct rk628_hdcp *hdcp, bool en void rk628_hdmirx_controller_setup(struct rk628 *rk628); typedef void *HAUDINFO; +typedef void (*rk628_audio_info_cb)(struct rk628 *rk628, bool on); HAUDINFO rk628_hdmirx_audioinfo_alloc(struct device *dev, struct mutex *confctl_mutex, struct rk628 *rk628, - bool en); + bool en, + rk628_audio_info_cb info_cb); void rk628_hdmirx_audio_destroy(HAUDINFO info); void rk628_hdmirx_audio_setup(HAUDINFO info); void rk628_hdmirx_audio_cancel_work_audio(HAUDINFO info, bool sync);