You've already forked linux-rockchip
mirror of
https://github.com/armbian/linux-rockchip.git
synced 2026-01-06 11:08:10 -08:00
Merge adc2d82eee ("crypto: sa2ul - Select CRYPTO_DES") into android12-5.10-lts
Steps on the way to 5.10.180 Change-Id: I2356127ad84f0179909589c63453c3367e99f4ee Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -609,6 +609,22 @@
|
||||
clock-frequency = <100000>;
|
||||
};
|
||||
|
||||
&mcspi1 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&mcspi2 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&mcspi3 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&mcspi4 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&usb_otg_hs {
|
||||
interface-type = <0>;
|
||||
usb-phy = <&usb2_phy>;
|
||||
|
||||
@@ -116,6 +116,7 @@ void user_regs_reset_single_step(struct user_pt_regs *regs,
|
||||
void kernel_enable_single_step(struct pt_regs *regs);
|
||||
void kernel_disable_single_step(void);
|
||||
int kernel_active_single_step(void);
|
||||
void kernel_rewind_single_step(struct pt_regs *regs);
|
||||
|
||||
#ifdef CONFIG_HAVE_HW_BREAKPOINT
|
||||
int reinstall_suspended_bps(struct pt_regs *regs);
|
||||
|
||||
@@ -439,6 +439,11 @@ int kernel_active_single_step(void)
|
||||
}
|
||||
NOKPROBE_SYMBOL(kernel_active_single_step);
|
||||
|
||||
void kernel_rewind_single_step(struct pt_regs *regs)
|
||||
{
|
||||
set_regs_spsr_ss(regs);
|
||||
}
|
||||
|
||||
/* ptrace API */
|
||||
void user_enable_single_step(struct task_struct *task)
|
||||
{
|
||||
|
||||
@@ -223,6 +223,8 @@ int kgdb_arch_handle_exception(int exception_vector, int signo,
|
||||
*/
|
||||
if (!kernel_active_single_step())
|
||||
kernel_enable_single_step(linux_regs);
|
||||
else
|
||||
kernel_rewind_single_step(linux_regs);
|
||||
err = 0;
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -410,10 +410,9 @@ static unsigned int reserve_eilvt_offset(int offset, unsigned int new)
|
||||
if (vector && !eilvt_entry_is_changeable(vector, new))
|
||||
/* may not change if vectors are different */
|
||||
return rsvd;
|
||||
rsvd = atomic_cmpxchg(&eilvt_offsets[offset], rsvd, new);
|
||||
} while (rsvd != new);
|
||||
} while (!atomic_try_cmpxchg(&eilvt_offsets[offset], &rsvd, new));
|
||||
|
||||
rsvd &= ~APIC_EILVT_MASKED;
|
||||
rsvd = new & ~APIC_EILVT_MASKED;
|
||||
if (rsvd && rsvd != vector)
|
||||
pr_info("LVT offset %d assigned for vector 0x%02x\n",
|
||||
offset, rsvd);
|
||||
|
||||
@@ -2442,17 +2442,21 @@ static int io_apic_get_redir_entries(int ioapic)
|
||||
|
||||
unsigned int arch_dynirq_lower_bound(unsigned int from)
|
||||
{
|
||||
unsigned int ret;
|
||||
|
||||
/*
|
||||
* dmar_alloc_hwirq() may be called before setup_IO_APIC(), so use
|
||||
* gsi_top if ioapic_dynirq_base hasn't been initialized yet.
|
||||
*/
|
||||
if (!ioapic_initialized)
|
||||
return gsi_top;
|
||||
ret = ioapic_dynirq_base ? : gsi_top;
|
||||
|
||||
/*
|
||||
* For DT enabled machines ioapic_dynirq_base is irrelevant and not
|
||||
* updated. So simply return @from if ioapic_dynirq_base == 0.
|
||||
* For DT enabled machines ioapic_dynirq_base is irrelevant and
|
||||
* always 0. gsi_top can be 0 if there is no IO/APIC registered.
|
||||
* 0 is an invalid interrupt number for dynamic allocations. Return
|
||||
* @from instead.
|
||||
*/
|
||||
return ioapic_dynirq_base ? : from;
|
||||
return ret ? : from;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
|
||||
@@ -897,6 +897,7 @@ config CRYPTO_DEV_SA2UL
|
||||
select CRYPTO_AES_ARM64
|
||||
select CRYPTO_ALGAPI
|
||||
select CRYPTO_AUTHENC
|
||||
select CRYPTO_DES
|
||||
select CRYPTO_SHA1
|
||||
select CRYPTO_SHA256
|
||||
select CRYPTO_SHA512
|
||||
|
||||
@@ -284,6 +284,10 @@ static int instantiate_rng(struct device *ctrldev, int state_handle_mask,
|
||||
const u32 rdsta_if = RDSTA_IF0 << sh_idx;
|
||||
const u32 rdsta_pr = RDSTA_PR0 << sh_idx;
|
||||
const u32 rdsta_mask = rdsta_if | rdsta_pr;
|
||||
|
||||
/* Clear the contents before using the descriptor */
|
||||
memset(desc, 0x00, CAAM_CMD_SZ * 7);
|
||||
|
||||
/*
|
||||
* If the corresponding bit is set, this state handle
|
||||
* was initialized by somebody else, so it's left alone.
|
||||
@@ -327,8 +331,6 @@ static int instantiate_rng(struct device *ctrldev, int state_handle_mask,
|
||||
}
|
||||
|
||||
dev_info(ctrldev, "Instantiated RNG4 SH%d\n", sh_idx);
|
||||
/* Clear the contents before recreating the descriptor */
|
||||
memset(desc, 0x00, CAAM_CMD_SZ * 7);
|
||||
}
|
||||
|
||||
kfree(desc);
|
||||
|
||||
@@ -5844,7 +5844,7 @@ intel_get_crtc_new_encoder(const struct intel_atomic_state *state,
|
||||
num_encoders++;
|
||||
}
|
||||
|
||||
drm_WARN(encoder->base.dev, num_encoders != 1,
|
||||
drm_WARN(state->base.dev, num_encoders != 1,
|
||||
"%d encoders for pipe %c\n",
|
||||
num_encoders, pipe_name(crtc->pipe));
|
||||
|
||||
|
||||
@@ -392,8 +392,10 @@ static int lima_pdev_probe(struct platform_device *pdev)
|
||||
|
||||
/* Allocate and initialize the DRM device. */
|
||||
ddev = drm_dev_alloc(&lima_drm_driver, &pdev->dev);
|
||||
if (IS_ERR(ddev))
|
||||
return PTR_ERR(ddev);
|
||||
if (IS_ERR(ddev)) {
|
||||
err = PTR_ERR(ddev);
|
||||
goto err_out0;
|
||||
}
|
||||
|
||||
ddev->dev_private = ldev;
|
||||
ldev->ddev = ddev;
|
||||
|
||||
@@ -1553,12 +1553,12 @@ isert_check_pi_status(struct se_cmd *se_cmd, struct ib_mr *sig_mr)
|
||||
}
|
||||
sec_offset_err = mr_status.sig_err.sig_err_offset;
|
||||
do_div(sec_offset_err, block_size);
|
||||
se_cmd->bad_sector = sec_offset_err + se_cmd->t_task_lba;
|
||||
se_cmd->sense_info = sec_offset_err + se_cmd->t_task_lba;
|
||||
|
||||
isert_err("PI error found type %d at sector 0x%llx "
|
||||
"expected 0x%x vs actual 0x%x\n",
|
||||
mr_status.sig_err.err_type,
|
||||
(unsigned long long)se_cmd->bad_sector,
|
||||
(unsigned long long)se_cmd->sense_info,
|
||||
mr_status.sig_err.expected,
|
||||
mr_status.sig_err.actual);
|
||||
ret = 1;
|
||||
|
||||
@@ -1178,6 +1178,7 @@ static void dm1105_remove(struct pci_dev *pdev)
|
||||
struct dvb_demux *dvbdemux = &dev->demux;
|
||||
struct dmx_demux *dmx = &dvbdemux->dmx;
|
||||
|
||||
cancel_work_sync(&dev->ir.work);
|
||||
dm1105_ir_exit(dev);
|
||||
dmx->close(dmx);
|
||||
dvb_net_release(&dev->dvbnet);
|
||||
|
||||
@@ -300,6 +300,7 @@ int saa7134_ts_start(struct saa7134_dev *dev)
|
||||
|
||||
int saa7134_ts_fini(struct saa7134_dev *dev)
|
||||
{
|
||||
del_timer_sync(&dev->ts_q.timeout);
|
||||
saa7134_pgtable_free(dev->pci, &dev->ts_q.pt);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -185,6 +185,7 @@ int saa7134_vbi_init1(struct saa7134_dev *dev)
|
||||
int saa7134_vbi_fini(struct saa7134_dev *dev)
|
||||
{
|
||||
/* nothing */
|
||||
del_timer_sync(&dev->vbi_q.timeout);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -2153,6 +2153,7 @@ int saa7134_video_init1(struct saa7134_dev *dev)
|
||||
|
||||
void saa7134_video_fini(struct saa7134_dev *dev)
|
||||
{
|
||||
del_timer_sync(&dev->video_q.timeout);
|
||||
/* free stuff */
|
||||
saa7134_pgtable_free(dev->pci, &dev->video_q.pt);
|
||||
saa7134_pgtable_free(dev->pci, &dev->vbi_q.pt);
|
||||
|
||||
@@ -283,7 +283,6 @@ enum venus_dec_state {
|
||||
VENUS_DEC_STATE_DRAIN = 5,
|
||||
VENUS_DEC_STATE_DECODING = 6,
|
||||
VENUS_DEC_STATE_DRC = 7,
|
||||
VENUS_DEC_STATE_DRC_FLUSH_DONE = 8,
|
||||
};
|
||||
|
||||
struct venus_ts_metadata {
|
||||
@@ -348,7 +347,7 @@ struct venus_ts_metadata {
|
||||
* @priv: a private for HFI operations callbacks
|
||||
* @session_type: the type of the session (decoder or encoder)
|
||||
* @hprop: a union used as a holder by get property
|
||||
* @last_buf: last capture buffer for dynamic-resoluton-change
|
||||
* @next_buf_last: a flag to mark next queued capture buffer as last
|
||||
*/
|
||||
struct venus_inst {
|
||||
struct list_head list;
|
||||
@@ -410,7 +409,8 @@ struct venus_inst {
|
||||
union hfi_get_property hprop;
|
||||
unsigned int core_acquired: 1;
|
||||
unsigned int bit_depth;
|
||||
struct vb2_buffer *last_buf;
|
||||
bool next_buf_last;
|
||||
bool drain_active;
|
||||
};
|
||||
|
||||
#define IS_V1(core) ((core)->res->hfi_version == HFI_VERSION_1XX)
|
||||
|
||||
@@ -1347,6 +1347,12 @@ void venus_helper_vb2_buf_queue(struct vb2_buffer *vb)
|
||||
|
||||
v4l2_m2m_buf_queue(m2m_ctx, vbuf);
|
||||
|
||||
/* Skip processing queued capture buffers after LAST flag */
|
||||
if (inst->session_type == VIDC_SESSION_TYPE_DEC &&
|
||||
V4L2_TYPE_IS_CAPTURE(vb->vb2_queue->type) &&
|
||||
inst->codec_state == VENUS_DEC_STATE_DRC)
|
||||
goto unlock;
|
||||
|
||||
cache_payload(inst, vb);
|
||||
|
||||
if (inst->session_type == VIDC_SESSION_TYPE_ENC &&
|
||||
|
||||
@@ -495,6 +495,7 @@ static int
|
||||
vdec_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *cmd)
|
||||
{
|
||||
struct venus_inst *inst = to_inst(file);
|
||||
struct vb2_queue *dst_vq;
|
||||
struct hfi_frame_data fdata = {0};
|
||||
int ret;
|
||||
|
||||
@@ -518,8 +519,17 @@ vdec_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *cmd)
|
||||
|
||||
ret = hfi_session_process_buf(inst, &fdata);
|
||||
|
||||
if (!ret && inst->codec_state == VENUS_DEC_STATE_DECODING)
|
||||
if (!ret && inst->codec_state == VENUS_DEC_STATE_DECODING) {
|
||||
inst->codec_state = VENUS_DEC_STATE_DRAIN;
|
||||
inst->drain_active = true;
|
||||
}
|
||||
} else if (cmd->cmd == V4L2_DEC_CMD_START &&
|
||||
inst->codec_state == VENUS_DEC_STATE_STOPPED) {
|
||||
dst_vq = v4l2_m2m_get_vq(inst->fh.m2m_ctx,
|
||||
V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
|
||||
vb2_clear_last_buffer_dequeued(dst_vq);
|
||||
|
||||
inst->codec_state = VENUS_DEC_STATE_DECODING;
|
||||
}
|
||||
|
||||
unlock:
|
||||
@@ -636,6 +646,7 @@ static int vdec_output_conf(struct venus_inst *inst)
|
||||
{
|
||||
struct venus_core *core = inst->core;
|
||||
struct hfi_enable en = { .enable = 1 };
|
||||
struct hfi_buffer_requirements bufreq;
|
||||
u32 width = inst->out_width;
|
||||
u32 height = inst->out_height;
|
||||
u32 out_fmt, out2_fmt;
|
||||
@@ -711,6 +722,23 @@ static int vdec_output_conf(struct venus_inst *inst)
|
||||
}
|
||||
|
||||
if (IS_V3(core) || IS_V4(core)) {
|
||||
ret = venus_helper_get_bufreq(inst, HFI_BUFFER_OUTPUT, &bufreq);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (bufreq.size > inst->output_buf_size)
|
||||
return -EINVAL;
|
||||
|
||||
if (inst->dpb_fmt) {
|
||||
ret = venus_helper_get_bufreq(inst, HFI_BUFFER_OUTPUT2,
|
||||
&bufreq);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (bufreq.size > inst->output2_buf_size)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (inst->output2_buf_size) {
|
||||
ret = venus_helper_set_bufsize(inst,
|
||||
inst->output2_buf_size,
|
||||
@@ -916,10 +944,6 @@ static int vdec_start_capture(struct venus_inst *inst)
|
||||
return 0;
|
||||
|
||||
reconfigure:
|
||||
ret = hfi_session_flush(inst, HFI_FLUSH_OUTPUT, true);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = vdec_output_conf(inst);
|
||||
if (ret)
|
||||
return ret;
|
||||
@@ -947,15 +971,21 @@ reconfigure:
|
||||
|
||||
venus_pm_load_scale(inst);
|
||||
|
||||
inst->next_buf_last = false;
|
||||
|
||||
ret = hfi_session_continue(inst);
|
||||
if (ret)
|
||||
goto free_dpb_bufs;
|
||||
|
||||
inst->codec_state = VENUS_DEC_STATE_DECODING;
|
||||
|
||||
if (inst->drain_active)
|
||||
inst->codec_state = VENUS_DEC_STATE_DRAIN;
|
||||
|
||||
inst->streamon_cap = 1;
|
||||
inst->sequence_cap = 0;
|
||||
inst->reconfig = false;
|
||||
inst->drain_active = false;
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -971,7 +1001,10 @@ static int vdec_start_output(struct venus_inst *inst)
|
||||
|
||||
if (inst->codec_state == VENUS_DEC_STATE_SEEK) {
|
||||
ret = venus_helper_process_initial_out_bufs(inst);
|
||||
inst->codec_state = VENUS_DEC_STATE_DECODING;
|
||||
if (inst->next_buf_last)
|
||||
inst->codec_state = VENUS_DEC_STATE_DRC;
|
||||
else
|
||||
inst->codec_state = VENUS_DEC_STATE_DECODING;
|
||||
goto done;
|
||||
}
|
||||
|
||||
@@ -987,6 +1020,7 @@ static int vdec_start_output(struct venus_inst *inst)
|
||||
venus_helper_init_instance(inst);
|
||||
inst->sequence_out = 0;
|
||||
inst->reconfig = false;
|
||||
inst->next_buf_last = false;
|
||||
|
||||
ret = vdec_set_properties(inst);
|
||||
if (ret)
|
||||
@@ -1076,13 +1110,14 @@ static int vdec_stop_capture(struct venus_inst *inst)
|
||||
ret = hfi_session_flush(inst, HFI_FLUSH_ALL, true);
|
||||
fallthrough;
|
||||
case VENUS_DEC_STATE_DRAIN:
|
||||
vdec_cancel_dst_buffers(inst);
|
||||
inst->codec_state = VENUS_DEC_STATE_STOPPED;
|
||||
inst->drain_active = false;
|
||||
fallthrough;
|
||||
case VENUS_DEC_STATE_SEEK:
|
||||
vdec_cancel_dst_buffers(inst);
|
||||
break;
|
||||
case VENUS_DEC_STATE_DRC:
|
||||
WARN_ON(1);
|
||||
fallthrough;
|
||||
case VENUS_DEC_STATE_DRC_FLUSH_DONE:
|
||||
ret = hfi_session_flush(inst, HFI_FLUSH_OUTPUT, true);
|
||||
inst->codec_state = VENUS_DEC_STATE_CAPTURE_SETUP;
|
||||
venus_helper_free_dpb_bufs(inst);
|
||||
break;
|
||||
@@ -1101,6 +1136,7 @@ static int vdec_stop_output(struct venus_inst *inst)
|
||||
case VENUS_DEC_STATE_DECODING:
|
||||
case VENUS_DEC_STATE_DRAIN:
|
||||
case VENUS_DEC_STATE_STOPPED:
|
||||
case VENUS_DEC_STATE_DRC:
|
||||
ret = hfi_session_flush(inst, HFI_FLUSH_ALL, true);
|
||||
inst->codec_state = VENUS_DEC_STATE_SEEK;
|
||||
break;
|
||||
@@ -1206,9 +1242,28 @@ static void vdec_buf_cleanup(struct vb2_buffer *vb)
|
||||
static void vdec_vb2_buf_queue(struct vb2_buffer *vb)
|
||||
{
|
||||
struct venus_inst *inst = vb2_get_drv_priv(vb->vb2_queue);
|
||||
struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
|
||||
static const struct v4l2_event eos = { .type = V4L2_EVENT_EOS };
|
||||
|
||||
vdec_pm_get_put(inst);
|
||||
|
||||
mutex_lock(&inst->lock);
|
||||
|
||||
if (inst->next_buf_last && V4L2_TYPE_IS_CAPTURE(vb->vb2_queue->type) &&
|
||||
inst->codec_state == VENUS_DEC_STATE_DRC) {
|
||||
vbuf->flags |= V4L2_BUF_FLAG_LAST;
|
||||
vbuf->sequence = inst->sequence_cap++;
|
||||
vbuf->field = V4L2_FIELD_NONE;
|
||||
vb2_set_plane_payload(vb, 0, 0);
|
||||
v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_DONE);
|
||||
v4l2_event_queue_fh(&inst->fh, &eos);
|
||||
inst->next_buf_last = false;
|
||||
mutex_unlock(&inst->lock);
|
||||
return;
|
||||
}
|
||||
|
||||
mutex_unlock(&inst->lock);
|
||||
|
||||
venus_helper_vb2_buf_queue(vb);
|
||||
}
|
||||
|
||||
@@ -1252,20 +1307,15 @@ static void vdec_buf_done(struct venus_inst *inst, unsigned int buf_type,
|
||||
vb->timestamp = timestamp_us * NSEC_PER_USEC;
|
||||
vbuf->sequence = inst->sequence_cap++;
|
||||
|
||||
if (inst->last_buf == vb) {
|
||||
inst->last_buf = NULL;
|
||||
vbuf->flags |= V4L2_BUF_FLAG_LAST;
|
||||
vb2_set_plane_payload(vb, 0, 0);
|
||||
vb->timestamp = 0;
|
||||
}
|
||||
|
||||
if (vbuf->flags & V4L2_BUF_FLAG_LAST) {
|
||||
const struct v4l2_event ev = { .type = V4L2_EVENT_EOS };
|
||||
|
||||
v4l2_event_queue_fh(&inst->fh, &ev);
|
||||
|
||||
if (inst->codec_state == VENUS_DEC_STATE_DRAIN)
|
||||
if (inst->codec_state == VENUS_DEC_STATE_DRAIN) {
|
||||
inst->drain_active = false;
|
||||
inst->codec_state = VENUS_DEC_STATE_STOPPED;
|
||||
}
|
||||
}
|
||||
|
||||
if (!bytesused)
|
||||
@@ -1321,19 +1371,16 @@ static void vdec_event_change(struct venus_inst *inst,
|
||||
dev_dbg(dev, VDBGM "event %s sufficient resources (%ux%u)\n",
|
||||
sufficient ? "" : "not", ev_data->width, ev_data->height);
|
||||
|
||||
if (sufficient) {
|
||||
hfi_session_continue(inst);
|
||||
} else {
|
||||
switch (inst->codec_state) {
|
||||
case VENUS_DEC_STATE_INIT:
|
||||
inst->codec_state = VENUS_DEC_STATE_CAPTURE_SETUP;
|
||||
break;
|
||||
case VENUS_DEC_STATE_DECODING:
|
||||
inst->codec_state = VENUS_DEC_STATE_DRC;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
switch (inst->codec_state) {
|
||||
case VENUS_DEC_STATE_INIT:
|
||||
inst->codec_state = VENUS_DEC_STATE_CAPTURE_SETUP;
|
||||
break;
|
||||
case VENUS_DEC_STATE_DECODING:
|
||||
case VENUS_DEC_STATE_DRAIN:
|
||||
inst->codec_state = VENUS_DEC_STATE_DRC;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1342,19 +1389,17 @@ static void vdec_event_change(struct venus_inst *inst,
|
||||
* itself doesn't mark the last decoder output buffer with HFI EOS flag.
|
||||
*/
|
||||
|
||||
if (!sufficient && inst->codec_state == VENUS_DEC_STATE_DRC) {
|
||||
struct vb2_v4l2_buffer *last;
|
||||
if (inst->codec_state == VENUS_DEC_STATE_DRC) {
|
||||
int ret;
|
||||
|
||||
last = v4l2_m2m_last_dst_buf(inst->m2m_ctx);
|
||||
if (last)
|
||||
inst->last_buf = &last->vb2_buf;
|
||||
inst->next_buf_last = true;
|
||||
|
||||
ret = hfi_session_flush(inst, HFI_FLUSH_OUTPUT, false);
|
||||
if (ret)
|
||||
dev_dbg(dev, VDBGH "flush output error %d\n", ret);
|
||||
}
|
||||
|
||||
inst->next_buf_last = true;
|
||||
inst->reconfig = true;
|
||||
v4l2_event_queue_fh(&inst->fh, &ev);
|
||||
wake_up(&inst->reconf_wait);
|
||||
@@ -1397,8 +1442,7 @@ static void vdec_event_notify(struct venus_inst *inst, u32 event,
|
||||
|
||||
static void vdec_flush_done(struct venus_inst *inst)
|
||||
{
|
||||
if (inst->codec_state == VENUS_DEC_STATE_DRC)
|
||||
inst->codec_state = VENUS_DEC_STATE_DRC_FLUSH_DONE;
|
||||
dev_dbg(inst->core->dev_dec, VDBGH "flush done\n");
|
||||
}
|
||||
|
||||
static const struct hfi_inst_ops vdec_hfi_ops = {
|
||||
|
||||
@@ -2121,9 +2121,7 @@ static int fdp1_open(struct file *file)
|
||||
|
||||
if (ctx->hdl.error) {
|
||||
ret = ctx->hdl.error;
|
||||
v4l2_ctrl_handler_free(&ctx->hdl);
|
||||
kfree(ctx);
|
||||
goto done;
|
||||
goto error_ctx;
|
||||
}
|
||||
|
||||
ctx->fh.ctrl_handler = &ctx->hdl;
|
||||
@@ -2137,20 +2135,27 @@ static int fdp1_open(struct file *file)
|
||||
|
||||
if (IS_ERR(ctx->fh.m2m_ctx)) {
|
||||
ret = PTR_ERR(ctx->fh.m2m_ctx);
|
||||
|
||||
v4l2_ctrl_handler_free(&ctx->hdl);
|
||||
kfree(ctx);
|
||||
goto done;
|
||||
goto error_ctx;
|
||||
}
|
||||
|
||||
/* Perform any power management required */
|
||||
pm_runtime_get_sync(fdp1->dev);
|
||||
ret = pm_runtime_resume_and_get(fdp1->dev);
|
||||
if (ret < 0)
|
||||
goto error_pm;
|
||||
|
||||
v4l2_fh_add(&ctx->fh);
|
||||
|
||||
dprintk(fdp1, "Created instance: %p, m2m_ctx: %p\n",
|
||||
ctx, ctx->fh.m2m_ctx);
|
||||
|
||||
mutex_unlock(&fdp1->dev_mutex);
|
||||
return 0;
|
||||
|
||||
error_pm:
|
||||
v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
|
||||
error_ctx:
|
||||
v4l2_ctrl_handler_free(&ctx->hdl);
|
||||
kfree(ctx);
|
||||
done:
|
||||
mutex_unlock(&fdp1->dev_mutex);
|
||||
return ret;
|
||||
@@ -2255,7 +2260,6 @@ static int fdp1_probe(struct platform_device *pdev)
|
||||
struct fdp1_dev *fdp1;
|
||||
struct video_device *vfd;
|
||||
struct device_node *fcp_node;
|
||||
struct resource *res;
|
||||
struct clk *clk;
|
||||
unsigned int i;
|
||||
|
||||
@@ -2282,17 +2286,15 @@ static int fdp1_probe(struct platform_device *pdev)
|
||||
platform_set_drvdata(pdev, fdp1);
|
||||
|
||||
/* Memory-mapped registers */
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
fdp1->regs = devm_ioremap_resource(&pdev->dev, res);
|
||||
fdp1->regs = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(fdp1->regs))
|
||||
return PTR_ERR(fdp1->regs);
|
||||
|
||||
/* Interrupt service routine registration */
|
||||
fdp1->irq = ret = platform_get_irq(pdev, 0);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "cannot find IRQ\n");
|
||||
ret = platform_get_irq(pdev, 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
fdp1->irq = ret;
|
||||
|
||||
ret = devm_request_irq(&pdev->dev, fdp1->irq, fdp1_irq_handler, 0,
|
||||
dev_name(&pdev->dev), fdp1);
|
||||
@@ -2315,8 +2317,10 @@ static int fdp1_probe(struct platform_device *pdev)
|
||||
|
||||
/* Determine our clock rate */
|
||||
clk = clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(clk))
|
||||
return PTR_ERR(clk);
|
||||
if (IS_ERR(clk)) {
|
||||
ret = PTR_ERR(clk);
|
||||
goto put_dev;
|
||||
}
|
||||
|
||||
fdp1->clk_rate = clk_get_rate(clk);
|
||||
clk_put(clk);
|
||||
@@ -2325,7 +2329,7 @@ static int fdp1_probe(struct platform_device *pdev)
|
||||
ret = v4l2_device_register(&pdev->dev, &fdp1->v4l2_dev);
|
||||
if (ret) {
|
||||
v4l2_err(&fdp1->v4l2_dev, "Failed to register video device\n");
|
||||
return ret;
|
||||
goto put_dev;
|
||||
}
|
||||
|
||||
/* M2M registration */
|
||||
@@ -2355,7 +2359,9 @@ static int fdp1_probe(struct platform_device *pdev)
|
||||
|
||||
/* Power up the cells to read HW */
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
pm_runtime_get_sync(fdp1->dev);
|
||||
ret = pm_runtime_resume_and_get(fdp1->dev);
|
||||
if (ret < 0)
|
||||
goto disable_pm;
|
||||
|
||||
hw_version = fdp1_read(fdp1, FD1_IP_INTDATA);
|
||||
switch (hw_version) {
|
||||
@@ -2384,12 +2390,17 @@ static int fdp1_probe(struct platform_device *pdev)
|
||||
|
||||
return 0;
|
||||
|
||||
disable_pm:
|
||||
pm_runtime_disable(fdp1->dev);
|
||||
|
||||
release_m2m:
|
||||
v4l2_m2m_release(fdp1->m2m_dev);
|
||||
|
||||
unreg_dev:
|
||||
v4l2_device_unregister(&fdp1->v4l2_dev);
|
||||
|
||||
put_dev:
|
||||
rcar_fcp_put(fdp1->fcp);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -2401,6 +2412,7 @@ static int fdp1_remove(struct platform_device *pdev)
|
||||
video_unregister_device(&fdp1->vfd);
|
||||
v4l2_device_unregister(&fdp1->v4l2_dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
rcar_fcp_put(fdp1->fcp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -107,6 +107,8 @@ static int gpio_ir_recv_probe(struct platform_device *pdev)
|
||||
rcdev->map_name = RC_MAP_EMPTY;
|
||||
|
||||
gpio_dev->rcdev = rcdev;
|
||||
if (of_property_read_bool(np, "wakeup-source"))
|
||||
device_init_wakeup(dev, true);
|
||||
|
||||
rc = devm_rc_register_device(dev, rcdev);
|
||||
if (rc < 0) {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user