/************************************************** * * Private Methods * **************************************************/ static bool create_input_system_channel( input_system_cfg_t *cfg, bool metadata, input_system_channel_t *me) { bool rc = true; me->dma_id = ISYS2401_DMA0_ID; switch (cfg->input_port_id) { case INPUT_SYSTEM_CSI_PORT0_ID: case INPUT_SYSTEM_PIXELGEN_PORT0_ID: me->stream2mmio_id = STREAM2MMIO0_ID; me->ibuf_ctrl_id = IBUF_CTRL0_ID; break; case INPUT_SYSTEM_CSI_PORT1_ID: case INPUT_SYSTEM_PIXELGEN_PORT1_ID: me->stream2mmio_id = STREAM2MMIO1_ID; me->ibuf_ctrl_id = IBUF_CTRL1_ID; break; case INPUT_SYSTEM_CSI_PORT2_ID: case INPUT_SYSTEM_PIXELGEN_PORT2_ID: me->stream2mmio_id = STREAM2MMIO2_ID; me->ibuf_ctrl_id = IBUF_CTRL2_ID; break; default: rc = false; break; } if (rc == false) return false; if (!acquire_sid(me->stream2mmio_id, &(me->stream2mmio_sid_id))) { return false; } if (!acquire_ib_buffer( metadata ? cfg->metadata.bits_per_pixel : cfg->input_port_resolution.bits_per_pixel, metadata ? cfg->metadata.pixels_per_line : cfg->input_port_resolution.pixels_per_line, metadata ? cfg->metadata.lines_per_frame : cfg->input_port_resolution.lines_per_frame, metadata ? cfg->metadata.align_req_in_bytes : cfg->input_port_resolution.align_req_in_bytes, cfg->online, &(me->ib_buffer))) { release_sid(me->stream2mmio_id, &(me->stream2mmio_sid_id)); return false; } if (!acquire_dma_channel(me->dma_id, &(me->dma_channel))) { release_sid(me->stream2mmio_id, &(me->stream2mmio_sid_id)); release_ib_buffer(&(me->ib_buffer)); return false; } return true; }
static int mx3_camera_set_fmt(struct soc_camera_device *icd, struct v4l2_format *f) { struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent); struct mx3_camera_dev *mx3_cam = ici->priv; struct v4l2_subdev *sd = soc_camera_to_subdev(icd); const struct soc_camera_format_xlate *xlate; struct v4l2_pix_format *pix = &f->fmt.pix; struct v4l2_mbus_framefmt mf; int ret; xlate = soc_camera_xlate_by_fourcc(icd, pix->pixelformat); if (!xlate) { dev_warn(icd->dev.parent, "Format %x not found\n", pix->pixelformat); return -EINVAL; } stride_align(&pix->width); dev_dbg(icd->dev.parent, "Set format %dx%d\n", pix->width, pix->height); /* * Might have to perform a complete interface initialisation like in * ipu_csi_init_interface() in mxc_v4l2_s_param(). Also consider * mxc_v4l2_s_fmt() */ configure_geometry(mx3_cam, pix->width, pix->height, xlate->code); mf.width = pix->width; mf.height = pix->height; mf.field = pix->field; mf.colorspace = pix->colorspace; mf.code = xlate->code; ret = v4l2_subdev_call(sd, video, s_mbus_fmt, &mf); if (ret < 0) return ret; if (mf.code != xlate->code) return -EINVAL; if (!mx3_cam->idmac_channel[0]) { ret = acquire_dma_channel(mx3_cam); if (ret < 0) return ret; } pix->width = mf.width; pix->height = mf.height; pix->field = mf.field; mx3_cam->field = mf.field; pix->colorspace = mf.colorspace; icd->current_fmt = xlate; pix->bytesperline = soc_mbus_bytes_per_line(pix->width, xlate->host_fmt); if (pix->bytesperline < 0) return pix->bytesperline; pix->sizeimage = pix->height * pix->bytesperline; dev_dbg(icd->dev.parent, "Sensor set %dx%d\n", pix->width, pix->height); return ret; }