Re: [PATCH v7 1/2] [media] atmel-isc: add the Image Sensor Controller code
On 8/2/2016 15:32, Hans Verkuil wrote: On 08/02/2016 08:20 AM, Wu, Songjun wrote: +static unsigned int sensor_preferred = 1; +module_param(sensor_preferred, uint, S_IRUGO|S_IWUSR); +MODULE_PARM_DESC(sensor_preferred, +"Sensor is preferred to output the specified format (1-on 0-off) default 1"); I have no idea what this means. Can you elaborate? Why would you want to set this to 0? ISC can convert the raw format to the other format, e.g. YUYV. If we want to output YUYV format, there are two choices, one is the sensor output YUYV format, ISC bypass the data to the memory, the other is the sensor output raw format, ISC convert raw format to YUYV. So I provide a module parameter to user to select. I prefer to select the sensor to output the specified format, then I set this parameter to '1', not '0'. Does this only apply to YUYV? The reason I am hesitant about this option is that I am not convinced you need it. The default (sensor preferred) makes sense and that's what other drivers do as well. Unless you know of a real use-case where you want to set this to 0, I would just drop this option. If there *is* a real use-case, then split off adding this module option into a separate patch so we can discuss it more without blocking getting this driver into mainline. I don't like the way this is done here. This does not only apply to YUYV, ISC IP defines some formats that can be converted from raw format. In some scenarios, ISC can extend the formats, e.g. if the sensor does not support YUYV, but raw format, the ISC can output YUYV. OK, I will remove the related code. After this driver is accepted, I will submit another patch to add this feature. Thank you. Regards, Hans
Re: [PATCH v7 1/2] [media] atmel-isc: add the Image Sensor Controller code
On 08/02/2016 08:20 AM, Wu, Songjun wrote: >>> +static unsigned int sensor_preferred = 1; >>> +module_param(sensor_preferred, uint, S_IRUGO|S_IWUSR); >>> +MODULE_PARM_DESC(sensor_preferred, >>> +"Sensor is preferred to output the specified format (1-on >>> 0-off) default 1"); >> >> I have no idea what this means. Can you elaborate? Why would you want to set >> this to 0? >> > ISC can convert the raw format to the other format, e.g. YUYV. > If we want to output YUYV format, there are two choices, one is the > sensor output YUYV format, ISC bypass the data to the memory, the other > is the sensor output raw format, ISC convert raw format to YUYV. > > So I provide a module parameter to user to select. > I prefer to select the sensor to output the specified format, then I set > this parameter to '1', not '0'. Does this only apply to YUYV? The reason I am hesitant about this option is that I am not convinced you need it. The default (sensor preferred) makes sense and that's what other drivers do as well. Unless you know of a real use-case where you want to set this to 0, I would just drop this option. If there *is* a real use-case, then split off adding this module option into a separate patch so we can discuss it more without blocking getting this driver into mainline. I don't like the way this is done here. Regards, Hans
Re: [PATCH v7 1/2] [media] atmel-isc: add the Image Sensor Controller code
On 8/1/2016 17:47, Hans Verkuil wrote: Hi Songjun, Some more comments below. Except for one in the open/release functions it's all small things. On 07/29/2016 09:54 AM, Songjun Wu wrote: Add driver for the Image Sensor Controller. It manages incoming data from a parallel based CMOS/CCD sensor. It has an internal image processor, also integrates a triple channel direct memory access controller master interface. Signed-off-by: Songjun Wu --- Changes in v7: - Add enum_framesizes and enum_frameintervals. - Call s_stream(0) when stream start fail. - Fill the device_caps field of struct video_device with V4L2_CAP_STREAMING and V4L2_CAP_VIDEO_CAPTURE. - Initialize the dev of struct vb2_queue. - Set field to FIELD_NONE if the pix field is not supported. - Return the result directly when call g/s_parm of subdev. Changes in v6: None Changes in v5: - Modify the macro definition and the related code. Changes in v4: - Modify the isc clock code since the dt is changed. Changes in v3: - Add pm runtime feature. - Modify the isc clock code since the dt is changed. Changes in v2: - Add "depends on COMMON_CLK" and "VIDEO_V4L2_SUBDEV_API" in Kconfig file. - Correct typos and coding style according to Laurent's remarks - Delete the loop while in 'isc_clk_enable' function. - Replace 'hsync_active', 'vsync_active' and 'pclk_sample' with 'pfe_cfg0' in struct isc_subdev_entity. - Add the code to support VIDIOC_CREATE_BUFS in 'isc_queue_setup' function. - Invoke isc_config to configure register in 'isc_start_streaming' function. - Add the struct completion 'comp' to synchronize with the frame end interrupt in 'isc_stop_streaming' function. - Check the return value of the clk_prepare_enable in 'isc_open' function. - Set the default format in 'isc_open' function. - Add an exit condition in the loop while in 'isc_config'. - Delete the hardware setup operation in 'isc_set_format'. - Refuse format modification during streaming in 'isc_s_fmt_vid_cap' function. - Invoke v4l2_subdev_alloc_pad_config to allocate and initialize the pad config in 'isc_async_complete' function. - Remove the '.owner = THIS_MODULE,' in atmel_isc_driver. - Replace the module_platform_driver_probe() with module_platform_driver(). drivers/media/platform/Kconfig|1 + drivers/media/platform/Makefile |2 + drivers/media/platform/atmel/Kconfig |9 + drivers/media/platform/atmel/Makefile |1 + drivers/media/platform/atmel/atmel-isc-regs.h | 165 +++ drivers/media/platform/atmel/atmel-isc.c | 1611 + 6 files changed, 1789 insertions(+) create mode 100644 drivers/media/platform/atmel/Kconfig create mode 100644 drivers/media/platform/atmel/Makefile create mode 100644 drivers/media/platform/atmel/atmel-isc-regs.h create mode 100644 drivers/media/platform/atmel/atmel-isc.c diff --git a/drivers/media/platform/atmel/atmel-isc.c b/drivers/media/platform/atmel/atmel-isc.c new file mode 100644 index 000..f2ef664 --- /dev/null +++ b/drivers/media/platform/atmel/atmel-isc.c @@ -0,0 +1,1611 @@ +static unsigned int sensor_preferred = 1; +module_param(sensor_preferred, uint, S_IRUGO|S_IWUSR); +MODULE_PARM_DESC(sensor_preferred, +"Sensor is preferred to output the specified format (1-on 0-off) default 1"); I have no idea what this means. Can you elaborate? Why would you want to set this to 0? ISC can convert the raw format to the other format, e.g. YUYV. If we want to output YUYV format, there are two choices, one is the sensor output YUYV format, ISC bypass the data to the memory, the other is the sensor output raw format, ISC convert raw format to YUYV. So I provide a module parameter to user to select. I prefer to select the sensor to output the specified format, then I set this parameter to '1', not '0'. +static inline bool sensor_is_preferred(const struct isc_format *isc_fmt) +{ + if ((sensor_preferred && isc_fmt->sd_support) || + !isc_fmt->isc_support) I'd just do: return (sensor_preferred && isc_fmt->sd_support) || !isc_fmt->isc_support; Accept, thank you. + return true; + else + return false; +} + +static int isc_try_fmt(struct isc_device *isc, struct v4l2_format *f, + struct isc_format **current_fmt, u32 *code) +{ + struct isc_format *isc_fmt; + struct v4l2_pix_format *pixfmt = &f->fmt.pix; + struct v4l2_subdev_format format = { + .which = V4L2_SUBDEV_FORMAT_TRY, + }; + u32 mbus_code; + int ret; + + if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) + return -EINVAL; + + isc_fmt = find_format_by_fourcc(isc, pixfmt->pixelformat); + if (!isc_fmt) { + v4l2_warn(&isc->v4l2_dev, "Format 0x%x not found\n", + pixfmt->pixelformat); + isc_fmt = isc->user_formats[isc->num_user_
Re: [PATCH v7 1/2] [media] atmel-isc: add the Image Sensor Controller code
Hi Songjun, Some more comments below. Except for one in the open/release functions it's all small things. On 07/29/2016 09:54 AM, Songjun Wu wrote: > Add driver for the Image Sensor Controller. It manages > incoming data from a parallel based CMOS/CCD sensor. > It has an internal image processor, also integrates a > triple channel direct memory access controller master > interface. > > Signed-off-by: Songjun Wu > --- > > Changes in v7: > - Add enum_framesizes and enum_frameintervals. > - Call s_stream(0) when stream start fail. > - Fill the device_caps field of struct video_device > with V4L2_CAP_STREAMING and V4L2_CAP_VIDEO_CAPTURE. > - Initialize the dev of struct vb2_queue. > - Set field to FIELD_NONE if the pix field is not supported. > - Return the result directly when call g/s_parm of subdev. > > Changes in v6: None > Changes in v5: > - Modify the macro definition and the related code. > > Changes in v4: > - Modify the isc clock code since the dt is changed. > > Changes in v3: > - Add pm runtime feature. > - Modify the isc clock code since the dt is changed. > > Changes in v2: > - Add "depends on COMMON_CLK" and "VIDEO_V4L2_SUBDEV_API" > in Kconfig file. > - Correct typos and coding style according to Laurent's remarks > - Delete the loop while in 'isc_clk_enable' function. > - Replace 'hsync_active', 'vsync_active' and 'pclk_sample' > with 'pfe_cfg0' in struct isc_subdev_entity. > - Add the code to support VIDIOC_CREATE_BUFS in > 'isc_queue_setup' function. > - Invoke isc_config to configure register in > 'isc_start_streaming' function. > - Add the struct completion 'comp' to synchronize with > the frame end interrupt in 'isc_stop_streaming' function. > - Check the return value of the clk_prepare_enable > in 'isc_open' function. > - Set the default format in 'isc_open' function. > - Add an exit condition in the loop while in 'isc_config'. > - Delete the hardware setup operation in 'isc_set_format'. > - Refuse format modification during streaming > in 'isc_s_fmt_vid_cap' function. > - Invoke v4l2_subdev_alloc_pad_config to allocate and > initialize the pad config in 'isc_async_complete' function. > - Remove the '.owner = THIS_MODULE,' in atmel_isc_driver. > - Replace the module_platform_driver_probe() with > module_platform_driver(). > > drivers/media/platform/Kconfig|1 + > drivers/media/platform/Makefile |2 + > drivers/media/platform/atmel/Kconfig |9 + > drivers/media/platform/atmel/Makefile |1 + > drivers/media/platform/atmel/atmel-isc-regs.h | 165 +++ > drivers/media/platform/atmel/atmel-isc.c | 1611 > + > 6 files changed, 1789 insertions(+) > create mode 100644 drivers/media/platform/atmel/Kconfig > create mode 100644 drivers/media/platform/atmel/Makefile > create mode 100644 drivers/media/platform/atmel/atmel-isc-regs.h > create mode 100644 drivers/media/platform/atmel/atmel-isc.c > > diff --git a/drivers/media/platform/atmel/atmel-isc.c > b/drivers/media/platform/atmel/atmel-isc.c > new file mode 100644 > index 000..f2ef664 > --- /dev/null > +++ b/drivers/media/platform/atmel/atmel-isc.c > @@ -0,0 +1,1611 @@ > +static unsigned int sensor_preferred = 1; > +module_param(sensor_preferred, uint, S_IRUGO|S_IWUSR); > +MODULE_PARM_DESC(sensor_preferred, > + "Sensor is preferred to output the specified format (1-on > 0-off) default 1"); I have no idea what this means. Can you elaborate? Why would you want to set this to 0? > +static inline bool sensor_is_preferred(const struct isc_format *isc_fmt) > +{ > + if ((sensor_preferred && isc_fmt->sd_support) || > + !isc_fmt->isc_support) I'd just do: return (sensor_preferred && isc_fmt->sd_support) || !isc_fmt->isc_support; > + return true; > + else > + return false; > +} > + > +static int isc_try_fmt(struct isc_device *isc, struct v4l2_format *f, > + struct isc_format **current_fmt, u32 *code) > +{ > + struct isc_format *isc_fmt; > + struct v4l2_pix_format *pixfmt = &f->fmt.pix; > + struct v4l2_subdev_format format = { > + .which = V4L2_SUBDEV_FORMAT_TRY, > + }; > + u32 mbus_code; > + int ret; > + > + if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) > + return -EINVAL; > + > + isc_fmt = find_format_by_fourcc(isc, pixfmt->pixelformat); > + if (!isc_fmt) { > + v4l2_warn(&isc->v4l2_dev, "Format 0x%x not found\n", > + pixfmt->pixelformat); > + isc_fmt = isc->user_formats[isc->num_user_formats - 1]; > + pixfmt->pixelformat = isc_fmt->fourcc; > + } > + > + /* Limit to Atmel ISC hardware capabilities */ > + if (pixfmt->width > ISC_MAX_SUPPORT_WIDTH) > + pixfmt->width = ISC_MAX_SUPPORT_WIDTH; > + if (pixfmt->height > ISC_MAX_SUPPORT_HEIGHT) > + pixfmt->height = ISC
[PATCH v7 1/2] [media] atmel-isc: add the Image Sensor Controller code
Add driver for the Image Sensor Controller. It manages incoming data from a parallel based CMOS/CCD sensor. It has an internal image processor, also integrates a triple channel direct memory access controller master interface. Signed-off-by: Songjun Wu --- Changes in v7: - Add enum_framesizes and enum_frameintervals. - Call s_stream(0) when stream start fail. - Fill the device_caps field of struct video_device with V4L2_CAP_STREAMING and V4L2_CAP_VIDEO_CAPTURE. - Initialize the dev of struct vb2_queue. - Set field to FIELD_NONE if the pix field is not supported. - Return the result directly when call g/s_parm of subdev. Changes in v6: None Changes in v5: - Modify the macro definition and the related code. Changes in v4: - Modify the isc clock code since the dt is changed. Changes in v3: - Add pm runtime feature. - Modify the isc clock code since the dt is changed. Changes in v2: - Add "depends on COMMON_CLK" and "VIDEO_V4L2_SUBDEV_API" in Kconfig file. - Correct typos and coding style according to Laurent's remarks - Delete the loop while in 'isc_clk_enable' function. - Replace 'hsync_active', 'vsync_active' and 'pclk_sample' with 'pfe_cfg0' in struct isc_subdev_entity. - Add the code to support VIDIOC_CREATE_BUFS in 'isc_queue_setup' function. - Invoke isc_config to configure register in 'isc_start_streaming' function. - Add the struct completion 'comp' to synchronize with the frame end interrupt in 'isc_stop_streaming' function. - Check the return value of the clk_prepare_enable in 'isc_open' function. - Set the default format in 'isc_open' function. - Add an exit condition in the loop while in 'isc_config'. - Delete the hardware setup operation in 'isc_set_format'. - Refuse format modification during streaming in 'isc_s_fmt_vid_cap' function. - Invoke v4l2_subdev_alloc_pad_config to allocate and initialize the pad config in 'isc_async_complete' function. - Remove the '.owner = THIS_MODULE,' in atmel_isc_driver. - Replace the module_platform_driver_probe() with module_platform_driver(). drivers/media/platform/Kconfig|1 + drivers/media/platform/Makefile |2 + drivers/media/platform/atmel/Kconfig |9 + drivers/media/platform/atmel/Makefile |1 + drivers/media/platform/atmel/atmel-isc-regs.h | 165 +++ drivers/media/platform/atmel/atmel-isc.c | 1611 + 6 files changed, 1789 insertions(+) create mode 100644 drivers/media/platform/atmel/Kconfig create mode 100644 drivers/media/platform/atmel/Makefile create mode 100644 drivers/media/platform/atmel/atmel-isc-regs.h create mode 100644 drivers/media/platform/atmel/atmel-isc.c diff --git a/drivers/media/platform/Kconfig b/drivers/media/platform/Kconfig index f25344b..b23db17 100644 --- a/drivers/media/platform/Kconfig +++ b/drivers/media/platform/Kconfig @@ -111,6 +111,7 @@ source "drivers/media/platform/s5p-tv/Kconfig" source "drivers/media/platform/am437x/Kconfig" source "drivers/media/platform/xilinx/Kconfig" source "drivers/media/platform/rcar-vin/Kconfig" +source "drivers/media/platform/atmel/Kconfig" config VIDEO_TI_CAL tristate "TI CAL (Camera Adaptation Layer) driver" diff --git a/drivers/media/platform/Makefile b/drivers/media/platform/Makefile index 21771c1..37b6c75 100644 --- a/drivers/media/platform/Makefile +++ b/drivers/media/platform/Makefile @@ -58,6 +58,8 @@ obj-$(CONFIG_VIDEO_XILINX)+= xilinx/ obj-$(CONFIG_VIDEO_RCAR_VIN) += rcar-vin/ +obj-$(CONFIG_VIDEO_ATMEL_ISC) += atmel/ + ccflags-y += -I$(srctree)/drivers/media/i2c obj-$(CONFIG_VIDEO_MEDIATEK_VPU) += mtk-vpu/ diff --git a/drivers/media/platform/atmel/Kconfig b/drivers/media/platform/atmel/Kconfig new file mode 100644 index 000..867dca2 --- /dev/null +++ b/drivers/media/platform/atmel/Kconfig @@ -0,0 +1,9 @@ +config VIDEO_ATMEL_ISC + tristate "ATMEL Image Sensor Controller (ISC) support" + depends on VIDEO_V4L2 && COMMON_CLK && VIDEO_V4L2_SUBDEV_API && HAS_DMA + depends on ARCH_AT91 || COMPILE_TEST + select VIDEOBUF2_DMA_CONTIG + select REGMAP_MMIO + help + This module makes the ATMEL Image Sensor Controller available + as a v4l2 device. \ No newline at end of file diff --git a/drivers/media/platform/atmel/Makefile b/drivers/media/platform/atmel/Makefile new file mode 100644 index 000..9d7c999 --- /dev/null +++ b/drivers/media/platform/atmel/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_VIDEO_ATMEL_ISC) += atmel-isc.o diff --git a/drivers/media/platform/atmel/atmel-isc-regs.h b/drivers/media/platform/atmel/atmel-isc-regs.h new file mode 100644 index 000..00c4497 --- /dev/null +++ b/drivers/media/platform/atmel/atmel-isc-regs.h @@ -0,0 +1,165 @@ +#ifndef __ATMEL_ISC_REGS_H +#define __ATMEL_ISC_REGS_H + +#include + +/* ISC Control Enable Register 0 */ +#define ISC_CTRLEN 0x + +/* ISC Control Disable Register 0 */ +#define ISC_CTRLDIS