mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 02:50:49 +09:00
media: i2c: rk628: implement RK_HDMIRX_V4L2_EVENT_AUDIOINFO event
Change-Id: I568ac37ce08ba86a24e1a88b83bb3cb8e878fa03 Signed-off-by: Shunhua Lan <lsh@rock-chips.com>
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user