mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
media updates for v5.1-rc1
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEE+QmuaPwR3wnBdVwACF8+vY7k4RUFAlzTElIACgkQCF8+vY7k 4RV9DA//cnvJqEHWFRrRdM1YpyVeo8CWk4nNFu174f2VFFS3O32WuSMLGVtXI8Sq Kx9/hZtb20TN9D90V6TtGqH9x5k7qpdlYkGD4ZQFbokRYhzk1eJ7ZRkPfxNDPo7P hcRqN1njXWjQN61ekEbOsMXavbcB52D+ubtDaE+8stcn00HGQ8cIjNzzmi5VYlrs DSJNB6udrePhWgQGhmzdhN1x12+xeu6OSNx6xsUZ2paHHzbTNnrnFs2gc6vqXFAk HEkows3DKHk8y7vK85Fgwjm3L3PQbvWmrDvbbOLjNVegzCop65oK42UlaHJHLlgs BVE9SI9/5wHJMVKDf0IIVSA7GsWTqcA+nBC3rohWse2UZp+8691gGynQOvr7Z4wx T3ZKUIG3swX1yN8gUl8EVHv4jogD4xlog5SFanx1DJfkvwTnT5VfJZqryXBPP2lG knMxc6z7qmP8F2BLTXd2UxEujMA75RoSg2UKoJZHv3cu+zPSFjGVfCwahPdnNoeb FMaVDDayzk6eD8/joO0EM89bg1wj4vPEr/74SyNbHHOzIYfIs3fvHD2+p/KYsAeu /wQXGlK2ARTKSDgyCKq8OGY+mtuJTI5kkV/EVLnEa9kNEeFDdsRM1h8Y4y8UX0Ds 7PlAyQXPTixOW+1C2pxfzbJi4Bv6hjX2ijgjmE2CSn4zPJZ9qK4= =zjhI -----END PGP SIGNATURE----- Merge tag 'media/v5.1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media Pull media updates from Mauro Carvalho Chehab: - remove the deprecated Zoran driver from staging - new I2C driver: ST MIPID02 CSI-2 camera bridge - new platform driver: Amlogic Meson AO CEC G12A Controller - add support for USB audio via the media controller - au0828 driver is now supported via the media controller on both on media and on usbaudio - new kernel test for the media device allocator - add support for stateless decoder at vicodec driver - lots of other driver improvements fixes and cleanups * tag 'media/v5.1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (218 commits) media: dt-bindings: aspeed-video: Add missing memory-region property media: platform: Aspeed: Make reserved memory optional media: platform: Aspeed: Remove use of reset line media: stm32-dcmi: return appropriate error codes during probe media: vsp1: Add support for missing 16-bit RGB555 formats media: vsp1: Add support for missing 16-bit RGB444 formats media: vsp1: Add support for missing 32-bit RGB formats media: v4l: Add definitions for missing 16-bit RGB555 formats media: v4l: Add definitions for missing 16-bit RGB4444 formats media: v4l: Add definitions for missing 32-bit RGB formats media: zoran: remove deprecated driver media: MAINTAINERS: Update AO CEC with ao-cec-g12a driver media: platform: meson: Add Amlogic Meson G12A AO CEC Controller driver media: dt-bindings: media: meson-ao-cec: Add G12A AO-CEC-B Compatible media: cros-ec-cec: decrement HDMI device refcount media: seco-cec: decrement HDMI device refcount media: tegra_cec: use new cec_notifier_parse_hdmi_phandle helper media: stih_cec: use new cec_notifier_parse_hdmi_phandle helper media: s5p_cec: use new cec_notifier_parse_hdmi_phandle helper media: meson: ao-cec: use new cec_notifier_parse_hdmi_phandle helper ...
This commit is contained in:
commit
e7a1414f9d
324 changed files with 7625 additions and 13909 deletions
|
|
@ -31,14 +31,14 @@ comment "Multimedia core support"
|
|||
#
|
||||
config MEDIA_CAMERA_SUPPORT
|
||||
bool "Cameras/video grabbers support"
|
||||
---help---
|
||||
help
|
||||
Enable support for webcams and video grabbers.
|
||||
|
||||
Say Y when you have a webcam or a video capture grabber board.
|
||||
|
||||
config MEDIA_ANALOG_TV_SUPPORT
|
||||
bool "Analog TV support"
|
||||
---help---
|
||||
help
|
||||
Enable analog TV support.
|
||||
|
||||
Say Y when you have a TV board with analog support or with a
|
||||
|
|
@ -50,7 +50,7 @@ config MEDIA_ANALOG_TV_SUPPORT
|
|||
|
||||
config MEDIA_DIGITAL_TV_SUPPORT
|
||||
bool "Digital TV support"
|
||||
---help---
|
||||
help
|
||||
Enable digital TV support.
|
||||
|
||||
Say Y when you have a board with digital support or a board with
|
||||
|
|
@ -58,7 +58,7 @@ config MEDIA_DIGITAL_TV_SUPPORT
|
|||
|
||||
config MEDIA_RADIO_SUPPORT
|
||||
bool "AM/FM radio receivers/transmitters support"
|
||||
---help---
|
||||
help
|
||||
Enable AM/FM radio support.
|
||||
|
||||
Additional info and docs are available on the web at
|
||||
|
|
@ -72,14 +72,14 @@ config MEDIA_RADIO_SUPPORT
|
|||
|
||||
config MEDIA_SDR_SUPPORT
|
||||
bool "Software defined radio support"
|
||||
---help---
|
||||
help
|
||||
Enable software defined radio support.
|
||||
|
||||
Say Y when you have a software defined radio device.
|
||||
|
||||
config MEDIA_CEC_SUPPORT
|
||||
bool "HDMI CEC support"
|
||||
---help---
|
||||
help
|
||||
Enable support for HDMI CEC (Consumer Electronics Control),
|
||||
which is an optional HDMI feature.
|
||||
|
||||
|
|
@ -96,7 +96,7 @@ source "drivers/media/cec/Kconfig"
|
|||
config MEDIA_CONTROLLER
|
||||
bool "Media Controller API"
|
||||
depends on MEDIA_CAMERA_SUPPORT || MEDIA_ANALOG_TV_SUPPORT || MEDIA_DIGITAL_TV_SUPPORT
|
||||
---help---
|
||||
help
|
||||
Enable the media controller API used to query media devices internal
|
||||
topology and configure it dynamically.
|
||||
|
||||
|
|
@ -105,7 +105,7 @@ config MEDIA_CONTROLLER
|
|||
config MEDIA_CONTROLLER_DVB
|
||||
bool "Enable Media controller for DVB (EXPERIMENTAL)"
|
||||
depends on MEDIA_CONTROLLER && DVB_CORE
|
||||
---help---
|
||||
help
|
||||
Enable the media controller API support for DVB.
|
||||
|
||||
This is currently experimental.
|
||||
|
|
@ -114,7 +114,7 @@ config MEDIA_CONTROLLER_REQUEST_API
|
|||
bool "Enable Media controller Request API (EXPERIMENTAL)"
|
||||
depends on MEDIA_CONTROLLER && STAGING_MEDIA
|
||||
default n
|
||||
---help---
|
||||
help
|
||||
DO NOT ENABLE THIS OPTION UNLESS YOU KNOW WHAT YOU'RE DOING.
|
||||
|
||||
This option enables the Request API for the Media controller and V4L2
|
||||
|
|
@ -137,7 +137,7 @@ config VIDEO_DEV
|
|||
config VIDEO_V4L2_SUBDEV_API
|
||||
bool "V4L2 sub-device userspace API"
|
||||
depends on VIDEO_DEV && MEDIA_CONTROLLER
|
||||
---help---
|
||||
help
|
||||
Enables the V4L2 sub-device pad-level userspace API used to configure
|
||||
video format, size and frame rate between hardware blocks.
|
||||
|
||||
|
|
|
|||
|
|
@ -6,6 +6,12 @@
|
|||
media-objs := media-device.o media-devnode.o media-entity.o \
|
||||
media-request.o
|
||||
|
||||
ifeq ($(CONFIG_MEDIA_CONTROLLER),y)
|
||||
ifeq ($(CONFIG_USB),y)
|
||||
media-objs += media-dev-allocator.o
|
||||
endif
|
||||
endif
|
||||
|
||||
#
|
||||
# I2C drivers should come before other drivers, otherwise they'll fail
|
||||
# when compiled as builtin drivers
|
||||
|
|
|
|||
|
|
@ -2,11 +2,11 @@ config MEDIA_CEC_RC
|
|||
bool "HDMI CEC RC integration"
|
||||
depends on CEC_CORE && RC_CORE
|
||||
depends on CEC_CORE=m || RC_CORE=y
|
||||
---help---
|
||||
help
|
||||
Pass on CEC remote control messages to the RC framework.
|
||||
|
||||
config CEC_PIN_ERROR_INJ
|
||||
bool "Enable CEC error injection support"
|
||||
depends on CEC_PIN && DEBUG_FS
|
||||
---help---
|
||||
help
|
||||
This option enables CEC error injection using debugfs.
|
||||
|
|
|
|||
|
|
@ -126,6 +126,7 @@ static int __must_check cec_devnode_register(struct cec_devnode *devnode,
|
|||
/* Part 2: Initialize and register the character device */
|
||||
cdev_init(&devnode->cdev, &cec_devnode_fops);
|
||||
devnode->cdev.owner = owner;
|
||||
kobject_set_name(&devnode->cdev.kobj, "cec%d", devnode->minor);
|
||||
|
||||
ret = cdev_device_add(&devnode->cdev, &devnode->dev);
|
||||
if (ret) {
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/of_platform.h>
|
||||
|
||||
#include <media/cec.h>
|
||||
#include <media/cec-notifier.h>
|
||||
|
|
@ -127,3 +128,32 @@ void cec_notifier_unregister(struct cec_notifier *n)
|
|||
cec_notifier_put(n);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cec_notifier_unregister);
|
||||
|
||||
struct device *cec_notifier_parse_hdmi_phandle(struct device *dev)
|
||||
{
|
||||
struct platform_device *hdmi_pdev;
|
||||
struct device *hdmi_dev = NULL;
|
||||
struct device_node *np;
|
||||
|
||||
np = of_parse_phandle(dev->of_node, "hdmi-phandle", 0);
|
||||
|
||||
if (!np) {
|
||||
dev_err(dev, "Failed to find HDMI node in device tree\n");
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
hdmi_pdev = of_find_device_by_node(np);
|
||||
of_node_put(np);
|
||||
if (hdmi_pdev) {
|
||||
hdmi_dev = &hdmi_pdev->dev;
|
||||
/*
|
||||
* Note that the device struct is only used as a key into the
|
||||
* cec_notifiers list, it is never actually accessed.
|
||||
* So we decrement the reference here so we don't leak
|
||||
* memory.
|
||||
*/
|
||||
put_device(hdmi_dev);
|
||||
return hdmi_dev;
|
||||
}
|
||||
return ERR_PTR(-EPROBE_DEFER);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cec_notifier_parse_hdmi_phandle);
|
||||
|
|
|
|||
|
|
@ -1028,7 +1028,7 @@ static int cx2341x_api(void *priv, cx2341x_mbox_func func,
|
|||
return func(priv, cmd, args, 0, data);
|
||||
}
|
||||
|
||||
#define NEQ(field) (old->field != new->field)
|
||||
#define CMP_FIELD(__old, __new, __field) (__old->__field != __new->__field)
|
||||
|
||||
int cx2341x_update(void *priv, cx2341x_mbox_func func,
|
||||
const struct cx2341x_mpeg_params *old,
|
||||
|
|
@ -1042,20 +1042,22 @@ int cx2341x_update(void *priv, cx2341x_mbox_func func,
|
|||
11, /* VCD */
|
||||
12, /* SVCD */
|
||||
};
|
||||
|
||||
int err = 0;
|
||||
int force = (old == NULL);
|
||||
u16 temporal = new->video_temporal_filter;
|
||||
int err;
|
||||
|
||||
cx2341x_api(priv, func, CX2341X_ENC_SET_OUTPUT_PORT, 2, new->port, 0);
|
||||
|
||||
if (force || NEQ(is_50hz)) {
|
||||
if (!old ||
|
||||
CMP_FIELD(old, new, is_50hz)) {
|
||||
err = cx2341x_api(priv, func, CX2341X_ENC_SET_FRAME_RATE, 1,
|
||||
new->is_50hz);
|
||||
if (err) return err;
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
if (force || NEQ(width) || NEQ(height) || NEQ(video_encoding)) {
|
||||
if (!old ||
|
||||
CMP_FIELD(old, new, width) ||
|
||||
CMP_FIELD(old, new, height) ||
|
||||
CMP_FIELD(old, new, video_encoding)) {
|
||||
u16 w = new->width;
|
||||
u16 h = new->height;
|
||||
|
||||
|
|
@ -1065,94 +1067,127 @@ int cx2341x_update(void *priv, cx2341x_mbox_func func,
|
|||
}
|
||||
err = cx2341x_api(priv, func, CX2341X_ENC_SET_FRAME_SIZE, 2,
|
||||
h, w);
|
||||
if (err) return err;
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
if (force || NEQ(stream_type)) {
|
||||
if (!old ||
|
||||
CMP_FIELD(old, new, stream_type)) {
|
||||
err = cx2341x_api(priv, func, CX2341X_ENC_SET_STREAM_TYPE, 1,
|
||||
mpeg_stream_type[new->stream_type]);
|
||||
if (err) return err;
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
if (force || NEQ(video_aspect)) {
|
||||
if (!old ||
|
||||
CMP_FIELD(old, new, video_aspect)) {
|
||||
err = cx2341x_api(priv, func, CX2341X_ENC_SET_ASPECT_RATIO, 1,
|
||||
1 + new->video_aspect);
|
||||
if (err) return err;
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
if (force || NEQ(video_b_frames) || NEQ(video_gop_size)) {
|
||||
if (!old ||
|
||||
CMP_FIELD(old, new, video_b_frames) ||
|
||||
CMP_FIELD(old, new, video_gop_size)) {
|
||||
err = cx2341x_api(priv, func, CX2341X_ENC_SET_GOP_PROPERTIES, 2,
|
||||
new->video_gop_size, new->video_b_frames + 1);
|
||||
if (err) return err;
|
||||
new->video_gop_size, new->video_b_frames + 1);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
if (force || NEQ(video_gop_closure)) {
|
||||
if (!old ||
|
||||
CMP_FIELD(old, new, video_gop_closure)) {
|
||||
err = cx2341x_api(priv, func, CX2341X_ENC_SET_GOP_CLOSURE, 1,
|
||||
new->video_gop_closure);
|
||||
if (err) return err;
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
if (force || NEQ(audio_properties)) {
|
||||
if (!old ||
|
||||
CMP_FIELD(old, new, audio_properties)) {
|
||||
err = cx2341x_api(priv, func, CX2341X_ENC_SET_AUDIO_PROPERTIES,
|
||||
1, new->audio_properties);
|
||||
if (err) return err;
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
if (force || NEQ(audio_mute)) {
|
||||
if (!old ||
|
||||
CMP_FIELD(old, new, audio_mute)) {
|
||||
err = cx2341x_api(priv, func, CX2341X_ENC_MUTE_AUDIO, 1,
|
||||
new->audio_mute);
|
||||
if (err) return err;
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
if (force || NEQ(video_bitrate_mode) || NEQ(video_bitrate) ||
|
||||
NEQ(video_bitrate_peak)) {
|
||||
if (!old ||
|
||||
CMP_FIELD(old, new, video_bitrate_mode) ||
|
||||
CMP_FIELD(old, new, video_bitrate) ||
|
||||
CMP_FIELD(old, new, video_bitrate_peak)) {
|
||||
err = cx2341x_api(priv, func, CX2341X_ENC_SET_BIT_RATE, 5,
|
||||
new->video_bitrate_mode, new->video_bitrate,
|
||||
new->video_bitrate_peak / 400, 0, 0);
|
||||
if (err) return err;
|
||||
new->video_bitrate_mode, new->video_bitrate,
|
||||
new->video_bitrate_peak / 400, 0, 0);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
if (force || NEQ(video_spatial_filter_mode) ||
|
||||
NEQ(video_temporal_filter_mode) ||
|
||||
NEQ(video_median_filter_type)) {
|
||||
if (!old ||
|
||||
CMP_FIELD(old, new, video_spatial_filter_mode) ||
|
||||
CMP_FIELD(old, new, video_temporal_filter_mode) ||
|
||||
CMP_FIELD(old, new, video_median_filter_type)) {
|
||||
err = cx2341x_api(priv, func, CX2341X_ENC_SET_DNR_FILTER_MODE,
|
||||
2, new->video_spatial_filter_mode |
|
||||
2,
|
||||
new->video_spatial_filter_mode |
|
||||
(new->video_temporal_filter_mode << 1),
|
||||
new->video_median_filter_type);
|
||||
if (err) return err;
|
||||
new->video_median_filter_type);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
if (force || NEQ(video_luma_median_filter_bottom) ||
|
||||
NEQ(video_luma_median_filter_top) ||
|
||||
NEQ(video_chroma_median_filter_bottom) ||
|
||||
NEQ(video_chroma_median_filter_top)) {
|
||||
if (!old ||
|
||||
CMP_FIELD(old, new, video_luma_median_filter_bottom) ||
|
||||
CMP_FIELD(old, new, video_luma_median_filter_top) ||
|
||||
CMP_FIELD(old, new, video_chroma_median_filter_bottom) ||
|
||||
CMP_FIELD(old, new, video_chroma_median_filter_top)) {
|
||||
err = cx2341x_api(priv, func, CX2341X_ENC_SET_CORING_LEVELS, 4,
|
||||
new->video_luma_median_filter_bottom,
|
||||
new->video_luma_median_filter_top,
|
||||
new->video_chroma_median_filter_bottom,
|
||||
new->video_chroma_median_filter_top);
|
||||
if (err) return err;
|
||||
new->video_luma_median_filter_bottom,
|
||||
new->video_luma_median_filter_top,
|
||||
new->video_chroma_median_filter_bottom,
|
||||
new->video_chroma_median_filter_top);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
if (force || NEQ(video_luma_spatial_filter_type) ||
|
||||
NEQ(video_chroma_spatial_filter_type)) {
|
||||
if (!old ||
|
||||
CMP_FIELD(old, new, video_luma_spatial_filter_type) ||
|
||||
CMP_FIELD(old, new, video_chroma_spatial_filter_type)) {
|
||||
err = cx2341x_api(priv, func,
|
||||
CX2341X_ENC_SET_SPATIAL_FILTER_TYPE,
|
||||
2, new->video_luma_spatial_filter_type,
|
||||
new->video_chroma_spatial_filter_type);
|
||||
if (err) return err;
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
if (force || NEQ(video_spatial_filter) ||
|
||||
old->video_temporal_filter != temporal) {
|
||||
if (!old ||
|
||||
CMP_FIELD(old, new, video_spatial_filter) ||
|
||||
CMP_FIELD(old, new, video_temporal_filter)) {
|
||||
err = cx2341x_api(priv, func, CX2341X_ENC_SET_DNR_FILTER_PROPS,
|
||||
2, new->video_spatial_filter, temporal);
|
||||
if (err) return err;
|
||||
2, new->video_spatial_filter,
|
||||
new->video_temporal_filter);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
if (force || NEQ(video_temporal_decimation)) {
|
||||
if (!old ||
|
||||
CMP_FIELD(old, new, video_temporal_decimation)) {
|
||||
err = cx2341x_api(priv, func, CX2341X_ENC_SET_FRAME_DROP_RATE,
|
||||
1, new->video_temporal_decimation);
|
||||
if (err) return err;
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
if (force || NEQ(video_mute) ||
|
||||
(new->video_mute && NEQ(video_mute_yuv))) {
|
||||
if (!old ||
|
||||
CMP_FIELD(old, new, video_mute) ||
|
||||
(new->video_mute && CMP_FIELD(old, new, video_mute_yuv))) {
|
||||
err = cx2341x_api(priv, func, CX2341X_ENC_MUTE_VIDEO, 1,
|
||||
new->video_mute | (new->video_mute_yuv << 8));
|
||||
if (err) return err;
|
||||
new->video_mute | (new->video_mute_yuv << 8));
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
if (force || NEQ(stream_insert_nav_packets)) {
|
||||
if (!old ||
|
||||
CMP_FIELD(old, new, stream_insert_nav_packets)) {
|
||||
err = cx2341x_api(priv, func, CX2341X_ENC_MISC, 2,
|
||||
7, new->stream_insert_nav_packets);
|
||||
if (err) return err;
|
||||
7, new->stream_insert_nav_packets);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ config SMS_SIANO_RC
|
|||
depends on SMS_USB_DRV || SMS_SDIO_DRV
|
||||
depends on MEDIA_COMMON_OPTIONS
|
||||
default y
|
||||
---help---
|
||||
help
|
||||
Choose Y to select Remote Controller support for Siano driver.
|
||||
|
||||
config SMS_SIANO_DEBUGFS
|
||||
|
|
@ -24,7 +24,7 @@ config SMS_SIANO_DEBUGFS
|
|||
depends on DEBUG_FS
|
||||
depends on SMS_USB_DRV = SMS_SDIO_DRV
|
||||
|
||||
---help---
|
||||
help
|
||||
Choose Y to enable visualizing a dump of the frontend
|
||||
statistics response packets via debugfs. Currently, works
|
||||
only with Siano USB devices.
|
||||
|
|
|
|||
|
|
@ -672,6 +672,11 @@ int vb2_core_reqbufs(struct vb2_queue *q, enum vb2_memory memory,
|
|||
return -EBUSY;
|
||||
}
|
||||
|
||||
if (q->waiting_in_dqbuf && *count) {
|
||||
dprintk(1, "another dup()ped fd is waiting for a buffer\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
if (*count == 0 || q->num_buffers != 0 ||
|
||||
(q->memory != VB2_MEMORY_UNKNOWN && q->memory != memory)) {
|
||||
/*
|
||||
|
|
@ -807,6 +812,10 @@ int vb2_core_create_bufs(struct vb2_queue *q, enum vb2_memory memory,
|
|||
}
|
||||
|
||||
if (!q->num_buffers) {
|
||||
if (q->waiting_in_dqbuf && *count) {
|
||||
dprintk(1, "another dup()ped fd is waiting for a buffer\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
memset(q->alloc_devs, 0, sizeof(q->alloc_devs));
|
||||
q->memory = memory;
|
||||
q->waiting_for_buffers = !q->is_output;
|
||||
|
|
@ -915,8 +924,7 @@ void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state)
|
|||
|
||||
if (WARN_ON(state != VB2_BUF_STATE_DONE &&
|
||||
state != VB2_BUF_STATE_ERROR &&
|
||||
state != VB2_BUF_STATE_QUEUED &&
|
||||
state != VB2_BUF_STATE_REQUEUEING))
|
||||
state != VB2_BUF_STATE_QUEUED))
|
||||
state = VB2_BUF_STATE_ERROR;
|
||||
|
||||
#ifdef CONFIG_VIDEO_ADV_DEBUG
|
||||
|
|
@ -929,8 +937,7 @@ void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state)
|
|||
dprintk(4, "done processing on buffer %d, state: %d\n",
|
||||
vb->index, state);
|
||||
|
||||
if (state != VB2_BUF_STATE_QUEUED &&
|
||||
state != VB2_BUF_STATE_REQUEUEING) {
|
||||
if (state != VB2_BUF_STATE_QUEUED) {
|
||||
/* sync buffers */
|
||||
for (plane = 0; plane < vb->num_planes; ++plane)
|
||||
call_void_memop(vb, finish, vb->planes[plane].mem_priv);
|
||||
|
|
@ -938,8 +945,7 @@ void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state)
|
|||
}
|
||||
|
||||
spin_lock_irqsave(&q->done_lock, flags);
|
||||
if (state == VB2_BUF_STATE_QUEUED ||
|
||||
state == VB2_BUF_STATE_REQUEUEING) {
|
||||
if (state == VB2_BUF_STATE_QUEUED) {
|
||||
vb->state = VB2_BUF_STATE_QUEUED;
|
||||
} else {
|
||||
/* Add the buffer to the done buffers list */
|
||||
|
|
@ -949,8 +955,6 @@ void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state)
|
|||
atomic_dec(&q->owned_by_drv_count);
|
||||
|
||||
if (state != VB2_BUF_STATE_QUEUED && vb->req_obj.req) {
|
||||
/* This is not supported at the moment */
|
||||
WARN_ON(state == VB2_BUF_STATE_REQUEUEING);
|
||||
media_request_object_unbind(&vb->req_obj);
|
||||
media_request_object_put(&vb->req_obj);
|
||||
}
|
||||
|
|
@ -962,10 +966,6 @@ void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state)
|
|||
switch (state) {
|
||||
case VB2_BUF_STATE_QUEUED:
|
||||
return;
|
||||
case VB2_BUF_STATE_REQUEUEING:
|
||||
if (q->start_streaming_called)
|
||||
__enqueue_in_driver(vb);
|
||||
return;
|
||||
default:
|
||||
/* Inform any processes that may be waiting for buffers */
|
||||
wake_up(&q->done_wq);
|
||||
|
|
@ -1516,6 +1516,12 @@ int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb,
|
|||
|
||||
vb = q->bufs[index];
|
||||
|
||||
if (!req && vb->state != VB2_BUF_STATE_IN_REQUEST &&
|
||||
q->requires_requests) {
|
||||
dprintk(1, "qbuf requires a request\n");
|
||||
return -EBADR;
|
||||
}
|
||||
|
||||
if ((req && q->uses_qbuf) ||
|
||||
(!req && vb->state != VB2_BUF_STATE_IN_REQUEST &&
|
||||
q->uses_requests)) {
|
||||
|
|
@ -1659,6 +1665,11 @@ static int __vb2_wait_for_done_vb(struct vb2_queue *q, int nonblocking)
|
|||
for (;;) {
|
||||
int ret;
|
||||
|
||||
if (q->waiting_in_dqbuf) {
|
||||
dprintk(1, "another dup()ped fd is waiting for a buffer\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
if (!q->streaming) {
|
||||
dprintk(1, "streaming off, will not wait for buffers\n");
|
||||
return -EINVAL;
|
||||
|
|
@ -1686,6 +1697,7 @@ static int __vb2_wait_for_done_vb(struct vb2_queue *q, int nonblocking)
|
|||
return -EAGAIN;
|
||||
}
|
||||
|
||||
q->waiting_in_dqbuf = 1;
|
||||
/*
|
||||
* We are streaming and blocking, wait for another buffer to
|
||||
* become ready or for streamoff. Driver's lock is released to
|
||||
|
|
@ -1706,6 +1718,7 @@ static int __vb2_wait_for_done_vb(struct vb2_queue *q, int nonblocking)
|
|||
* the locks or return an error if one occurred.
|
||||
*/
|
||||
call_void_qop(q, wait_finish, q);
|
||||
q->waiting_in_dqbuf = 0;
|
||||
if (ret) {
|
||||
dprintk(1, "sleep was interrupted\n");
|
||||
return ret;
|
||||
|
|
@ -2247,6 +2260,9 @@ int vb2_core_queue_init(struct vb2_queue *q)
|
|||
WARN_ON(!q->ops->buf_queue))
|
||||
return -EINVAL;
|
||||
|
||||
if (WARN_ON(q->requires_requests && !q->supports_requests))
|
||||
return -EINVAL;
|
||||
|
||||
INIT_LIST_HEAD(&q->queued_list);
|
||||
INIT_LIST_HEAD(&q->done_list);
|
||||
spin_lock_init(&q->done_lock);
|
||||
|
|
@ -2585,6 +2601,12 @@ static size_t __vb2_perform_fileio(struct vb2_queue *q, char __user *data, size_
|
|||
if (!data)
|
||||
return -EINVAL;
|
||||
|
||||
if (q->waiting_in_dqbuf) {
|
||||
dprintk(3, "another dup()ped fd is %s\n",
|
||||
read ? "reading" : "writing");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize emulator on first call.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -122,9 +122,9 @@ static int __verify_length(struct vb2_buffer *vb, const struct v4l2_buffer *b)
|
|||
}
|
||||
|
||||
/*
|
||||
* __init_v4l2_vb2_buffer() - initialize the v4l2_vb2_buffer struct
|
||||
* __init_vb2_v4l2_buffer() - initialize the vb2_v4l2_buffer struct
|
||||
*/
|
||||
static void __init_v4l2_vb2_buffer(struct vb2_buffer *vb)
|
||||
static void __init_vb2_v4l2_buffer(struct vb2_buffer *vb)
|
||||
{
|
||||
struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
|
||||
|
||||
|
|
@ -368,6 +368,12 @@ static int vb2_queue_or_prepare_buf(struct vb2_queue *q, struct media_device *md
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (!is_prepare && (b->flags & V4L2_BUF_FLAG_REQUEST_FD) &&
|
||||
vb->state != VB2_BUF_STATE_DEQUEUED) {
|
||||
dprintk(1, "%s: buffer is not in dequeued state\n", opname);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!vb->prepared) {
|
||||
/* Copy relevant information provided by the userspace */
|
||||
memset(vbuf->planes, 0,
|
||||
|
|
@ -381,6 +387,10 @@ static int vb2_queue_or_prepare_buf(struct vb2_queue *q, struct media_device *md
|
|||
return 0;
|
||||
|
||||
if (!(b->flags & V4L2_BUF_FLAG_REQUEST_FD)) {
|
||||
if (q->requires_requests) {
|
||||
dprintk(1, "%s: queue requires requests\n", opname);
|
||||
return -EBADR;
|
||||
}
|
||||
if (q->uses_requests) {
|
||||
dprintk(1, "%s: queue uses requests\n", opname);
|
||||
return -EBUSY;
|
||||
|
|
@ -388,7 +398,7 @@ static int vb2_queue_or_prepare_buf(struct vb2_queue *q, struct media_device *md
|
|||
return 0;
|
||||
} else if (!q->supports_requests) {
|
||||
dprintk(1, "%s: queue does not support requests\n", opname);
|
||||
return -EACCES;
|
||||
return -EBADR;
|
||||
} else if (q->uses_qbuf) {
|
||||
dprintk(1, "%s: queue does not use requests\n", opname);
|
||||
return -EBUSY;
|
||||
|
|
@ -419,11 +429,6 @@ static int vb2_queue_or_prepare_buf(struct vb2_queue *q, struct media_device *md
|
|||
!q->ops->buf_out_validate))
|
||||
return -EINVAL;
|
||||
|
||||
if (vb->state != VB2_BUF_STATE_DEQUEUED) {
|
||||
dprintk(1, "%s: buffer is not in dequeued state\n", opname);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (b->request_fd < 0) {
|
||||
dprintk(1, "%s: request_fd < 0\n", opname);
|
||||
return -EINVAL;
|
||||
|
|
@ -543,7 +548,6 @@ static void __fill_v4l2_buffer(struct vb2_buffer *vb, void *pb)
|
|||
break;
|
||||
case VB2_BUF_STATE_PREPARING:
|
||||
case VB2_BUF_STATE_DEQUEUED:
|
||||
case VB2_BUF_STATE_REQUEUEING:
|
||||
/* nothing */
|
||||
break;
|
||||
}
|
||||
|
|
@ -592,7 +596,7 @@ static int __fill_vb2_buffer(struct vb2_buffer *vb, struct vb2_plane *planes)
|
|||
|
||||
static const struct vb2_buf_ops v4l2_buf_ops = {
|
||||
.verify_planes_array = __verify_planes_array_core,
|
||||
.init_buffer = __init_v4l2_vb2_buffer,
|
||||
.init_buffer = __init_vb2_v4l2_buffer,
|
||||
.fill_user_buffer = __fill_v4l2_buffer,
|
||||
.fill_vb2_buffer = __fill_vb2_buffer,
|
||||
.copy_timestamp = __copy_timestamp,
|
||||
|
|
|
|||
|
|
@ -46,17 +46,17 @@ static void *vb2_vmalloc_alloc(struct device *dev, unsigned long attrs,
|
|||
|
||||
buf->size = size;
|
||||
buf->vaddr = vmalloc_user(buf->size);
|
||||
buf->dma_dir = dma_dir;
|
||||
buf->handler.refcount = &buf->refcount;
|
||||
buf->handler.put = vb2_vmalloc_put;
|
||||
buf->handler.arg = buf;
|
||||
|
||||
if (!buf->vaddr) {
|
||||
pr_debug("vmalloc of size %ld failed\n", buf->size);
|
||||
kfree(buf);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
buf->dma_dir = dma_dir;
|
||||
buf->handler.refcount = &buf->refcount;
|
||||
buf->handler.put = vb2_vmalloc_put;
|
||||
buf->handler.arg = buf;
|
||||
|
||||
refcount_set(&buf->refcount, 1);
|
||||
return buf;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -526,7 +526,6 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
|||
dvb_media_device_free(dvbdev);
|
||||
kfree(dvbdevfops);
|
||||
kfree(dvbdev);
|
||||
up_write(&minor_rwsem);
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -467,7 +467,7 @@ struct dvb_frontend *as102_attach(const char *name,
|
|||
|
||||
/* init frontend callback ops */
|
||||
memcpy(&fe->ops, &as102_fe_ops, sizeof(struct dvb_frontend_ops));
|
||||
strncpy(fe->ops.info.name, name, sizeof(fe->ops.info.name));
|
||||
strscpy(fe->ops.info.name, name, sizeof(fe->ops.info.name));
|
||||
|
||||
return fe;
|
||||
|
||||
|
|
|
|||
|
|
@ -2774,7 +2774,8 @@ static struct dvb_frontend *dib7000p_init(struct i2c_adapter *i2c_adap, u8 i2c_a
|
|||
dibx000_init_i2c_master(&st->i2c_master, DIB7000P, st->i2c_adap, st->i2c_addr);
|
||||
|
||||
/* init 7090 tuner adapter */
|
||||
strncpy(st->dib7090_tuner_adap.name, "DiB7090 tuner interface", sizeof(st->dib7090_tuner_adap.name));
|
||||
strscpy(st->dib7090_tuner_adap.name, "DiB7090 tuner interface",
|
||||
sizeof(st->dib7090_tuner_adap.name));
|
||||
st->dib7090_tuner_adap.algo = &dib7090_tuner_xfer_algo;
|
||||
st->dib7090_tuner_adap.algo_data = NULL;
|
||||
st->dib7090_tuner_adap.dev.parent = st->i2c_adap->dev.parent;
|
||||
|
|
|
|||
|
|
@ -4458,8 +4458,8 @@ static struct dvb_frontend *dib8000_init(struct i2c_adapter *i2c_adap, u8 i2c_ad
|
|||
dibx000_init_i2c_master(&state->i2c_master, DIB8000, state->i2c.adap, state->i2c.addr);
|
||||
|
||||
/* init 8096p tuner adapter */
|
||||
strncpy(state->dib8096p_tuner_adap.name, "DiB8096P tuner interface",
|
||||
sizeof(state->dib8096p_tuner_adap.name));
|
||||
strscpy(state->dib8096p_tuner_adap.name, "DiB8096P tuner interface",
|
||||
sizeof(state->dib8096p_tuner_adap.name));
|
||||
state->dib8096p_tuner_adap.algo = &dib8096p_tuner_xfer_algo;
|
||||
state->dib8096p_tuner_adap.algo_data = NULL;
|
||||
state->dib8096p_tuner_adap.dev.parent = state->i2c.adap->dev.parent;
|
||||
|
|
|
|||
|
|
@ -2521,7 +2521,8 @@ struct dvb_frontend *dib9000_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, c
|
|||
dibx000_init_i2c_master(&st->i2c_master, DIB7000MC, st->i2c.i2c_adap, st->i2c.i2c_addr);
|
||||
|
||||
st->tuner_adap.dev.parent = i2c_adap->dev.parent;
|
||||
strncpy(st->tuner_adap.name, "DIB9000_FW TUNER ACCESS", sizeof(st->tuner_adap.name));
|
||||
strscpy(st->tuner_adap.name, "DIB9000_FW TUNER ACCESS",
|
||||
sizeof(st->tuner_adap.name));
|
||||
st->tuner_adap.algo = &dib9000_tuner_algo;
|
||||
st->tuner_adap.algo_data = NULL;
|
||||
i2c_set_adapdata(&st->tuner_adap, st);
|
||||
|
|
@ -2529,7 +2530,8 @@ struct dvb_frontend *dib9000_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, c
|
|||
goto error;
|
||||
|
||||
st->component_bus.dev.parent = i2c_adap->dev.parent;
|
||||
strncpy(st->component_bus.name, "DIB9000_FW COMPONENT BUS ACCESS", sizeof(st->component_bus.name));
|
||||
strscpy(st->component_bus.name, "DIB9000_FW COMPONENT BUS ACCESS",
|
||||
sizeof(st->component_bus.name));
|
||||
st->component_bus.algo = &dib9000_component_bus_algo;
|
||||
st->component_bus.algo_data = NULL;
|
||||
st->component_bus_speed = 340;
|
||||
|
|
|
|||
|
|
@ -2263,61 +2263,41 @@ static int DRX_Start(struct drxd_state *state, s32 off)
|
|||
case DRX_CHANNEL_LOW:
|
||||
transmissionParams |= SC_RA_RAM_OP_PARAM_PRIO_LO;
|
||||
status = Write16(state, EC_SB_REG_PRIOR__A, EC_SB_REG_PRIOR_LO, 0x0000);
|
||||
if (status < 0)
|
||||
break;
|
||||
break;
|
||||
case DRX_CHANNEL_HIGH:
|
||||
transmissionParams |= SC_RA_RAM_OP_PARAM_PRIO_HI;
|
||||
status = Write16(state, EC_SB_REG_PRIOR__A, EC_SB_REG_PRIOR_HI, 0x0000);
|
||||
if (status < 0)
|
||||
break;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
switch (p->code_rate_HP) {
|
||||
case FEC_1_2:
|
||||
transmissionParams |= SC_RA_RAM_OP_PARAM_RATE_1_2;
|
||||
if (state->type_A) {
|
||||
if (state->type_A)
|
||||
status = Write16(state, EC_VD_REG_SET_CODERATE__A, EC_VD_REG_SET_CODERATE_C1_2, 0x0000);
|
||||
if (status < 0)
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
operationMode |= SC_RA_RAM_OP_AUTO_RATE__M;
|
||||
/* fall through */
|
||||
case FEC_2_3:
|
||||
transmissionParams |= SC_RA_RAM_OP_PARAM_RATE_2_3;
|
||||
if (state->type_A) {
|
||||
if (state->type_A)
|
||||
status = Write16(state, EC_VD_REG_SET_CODERATE__A, EC_VD_REG_SET_CODERATE_C2_3, 0x0000);
|
||||
if (status < 0)
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case FEC_3_4:
|
||||
transmissionParams |= SC_RA_RAM_OP_PARAM_RATE_3_4;
|
||||
if (state->type_A) {
|
||||
if (state->type_A)
|
||||
status = Write16(state, EC_VD_REG_SET_CODERATE__A, EC_VD_REG_SET_CODERATE_C3_4, 0x0000);
|
||||
if (status < 0)
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case FEC_5_6:
|
||||
transmissionParams |= SC_RA_RAM_OP_PARAM_RATE_5_6;
|
||||
if (state->type_A) {
|
||||
if (state->type_A)
|
||||
status = Write16(state, EC_VD_REG_SET_CODERATE__A, EC_VD_REG_SET_CODERATE_C5_6, 0x0000);
|
||||
if (status < 0)
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case FEC_7_8:
|
||||
transmissionParams |= SC_RA_RAM_OP_PARAM_RATE_7_8;
|
||||
if (state->type_A) {
|
||||
if (state->type_A)
|
||||
status = Write16(state, EC_VD_REG_SET_CODERATE__A, EC_VD_REG_SET_CODERATE_C7_8, 0x0000);
|
||||
if (status < 0)
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (status < 0)
|
||||
|
|
|
|||
|
|
@ -839,7 +839,7 @@ struct dvb_frontend *dvb_pll_attach(struct dvb_frontend *fe, int pll_addr,
|
|||
memcpy(&fe->ops.tuner_ops, &dvb_pll_tuner_ops,
|
||||
sizeof(struct dvb_tuner_ops));
|
||||
|
||||
strncpy(fe->ops.tuner_ops.info.name, desc->name,
|
||||
strscpy(fe->ops.tuner_ops.info.name, desc->name,
|
||||
sizeof(fe->ops.tuner_ops.info.name));
|
||||
|
||||
fe->ops.tuner_ops.info.frequency_min_hz = desc->min;
|
||||
|
|
|
|||
|
|
@ -309,6 +309,9 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
|||
u16 u16tmp;
|
||||
u32 tuner_frequency_khz, target_mclk;
|
||||
s32 s32tmp;
|
||||
static const struct reg_sequence reset_buf[] = {
|
||||
{0x07, 0x80}, {0x07, 0x00}
|
||||
};
|
||||
|
||||
dev_dbg(&client->dev,
|
||||
"delivery_system=%d modulation=%d frequency=%u symbol_rate=%d inversion=%d pilot=%d rolloff=%d\n",
|
||||
|
|
@ -321,11 +324,7 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
|||
}
|
||||
|
||||
/* reset */
|
||||
ret = regmap_write(dev->regmap, 0x07, 0x80);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
ret = regmap_write(dev->regmap, 0x07, 0x00);
|
||||
ret = regmap_multi_reg_write(dev->regmap, reset_buf, 2);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
|
|
@ -1470,7 +1469,7 @@ static int m88ds3103_probe(struct i2c_client *client,
|
|||
/* create dvb_frontend */
|
||||
memcpy(&dev->fe.ops, &m88ds3103_ops, sizeof(struct dvb_frontend_ops));
|
||||
if (dev->chip_id == M88RS6000_CHIP_ID)
|
||||
strncpy(dev->fe.ops.info.name, "Montage Technology M88RS6000",
|
||||
strscpy(dev->fe.ops.info.name, "Montage Technology M88RS6000",
|
||||
sizeof(dev->fe.ops.info.name));
|
||||
if (!pdata->attach_in_use)
|
||||
dev->fe.ops.release = NULL;
|
||||
|
|
|
|||
|
|
@ -275,18 +275,20 @@ static u32 si2165_get_fe_clk(struct si2165_state *state)
|
|||
|
||||
static int si2165_wait_init_done(struct si2165_state *state)
|
||||
{
|
||||
int ret = -EINVAL;
|
||||
int ret;
|
||||
u8 val = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 3; ++i) {
|
||||
si2165_readreg8(state, REG_INIT_DONE, &val);
|
||||
ret = si2165_readreg8(state, REG_INIT_DONE, &val);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if (val == 0x01)
|
||||
return 0;
|
||||
usleep_range(1000, 50000);
|
||||
}
|
||||
dev_err(&state->client->dev, "init_done was not set\n");
|
||||
return ret;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int si2165_upload_firmware_block(struct si2165_state *state,
|
||||
|
|
@ -1299,7 +1301,6 @@ MODULE_DEVICE_TABLE(i2c, si2165_id_table);
|
|||
|
||||
static struct i2c_driver si2165_driver = {
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "si2165",
|
||||
},
|
||||
.probe = si2165_probe,
|
||||
|
|
|
|||
|
|
@ -180,6 +180,9 @@ static int ts2020_set_tuner_rf(struct dvb_frontend *fe)
|
|||
unsigned int utmp;
|
||||
|
||||
ret = regmap_read(dev->regmap, 0x3d, &utmp);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
utmp &= 0x7f;
|
||||
if (utmp < 0x16)
|
||||
utmp = 0xa1;
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ config VIDEO_IR_I2C
|
|||
tristate "I2C module for IR" if !MEDIA_SUBDRV_AUTOSELECT
|
||||
depends on I2C && RC_CORE
|
||||
default y
|
||||
---help---
|
||||
help
|
||||
Most boards have an IR chip directly connected via GPIO. However,
|
||||
some video boards have the IR connected via I2C bus.
|
||||
|
||||
|
|
@ -29,7 +29,7 @@ comment "Audio decoders, processors and mixers"
|
|||
config VIDEO_TVAUDIO
|
||||
tristate "Simple audio decoder chips"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for several audio decoder chips found on some bt8xx boards:
|
||||
Philips: tda9840, tda9873h, tda9874h/a, tda9850, tda985x, tea6300,
|
||||
tea6320, tea6420, tda8425, ta8874z.
|
||||
|
|
@ -41,7 +41,7 @@ config VIDEO_TVAUDIO
|
|||
config VIDEO_TDA7432
|
||||
tristate "Philips TDA7432 audio processor"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for tda7432 audio decoder chip found on some bt8xx boards.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -50,7 +50,7 @@ config VIDEO_TDA7432
|
|||
config VIDEO_TDA9840
|
||||
tristate "Philips TDA9840 audio processor"
|
||||
depends on I2C
|
||||
---help---
|
||||
help
|
||||
Support for tda9840 audio decoder chip found on some Zoran boards.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -60,9 +60,10 @@ config VIDEO_TDA1997X
|
|||
tristate "NXP TDA1997x HDMI receiver"
|
||||
depends on VIDEO_V4L2 && I2C && VIDEO_V4L2_SUBDEV_API
|
||||
depends on SND_SOC
|
||||
select SND_PCM
|
||||
select HDMI
|
||||
---help---
|
||||
select SND_PCM
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
V4L2 subdevice driver for the NXP TDA1997x HDMI receivers.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -71,7 +72,7 @@ config VIDEO_TDA1997X
|
|||
config VIDEO_TEA6415C
|
||||
tristate "Philips TEA6415C audio processor"
|
||||
depends on I2C
|
||||
---help---
|
||||
help
|
||||
Support for tea6415c audio decoder chip found on some bt8xx boards.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -80,7 +81,7 @@ config VIDEO_TEA6415C
|
|||
config VIDEO_TEA6420
|
||||
tristate "Philips TEA6420 audio processor"
|
||||
depends on I2C
|
||||
---help---
|
||||
help
|
||||
Support for tea6420 audio decoder chip found on some bt8xx boards.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -89,7 +90,7 @@ config VIDEO_TEA6420
|
|||
config VIDEO_MSP3400
|
||||
tristate "Micronas MSP34xx audio decoders"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the Micronas MSP34xx series of audio decoders.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -98,7 +99,7 @@ config VIDEO_MSP3400
|
|||
config VIDEO_CS3308
|
||||
tristate "Cirrus Logic CS3308 audio ADC"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the Cirrus Logic CS3308 High Performance 8-Channel
|
||||
Analog Volume Control
|
||||
|
||||
|
|
@ -108,7 +109,7 @@ config VIDEO_CS3308
|
|||
config VIDEO_CS5345
|
||||
tristate "Cirrus Logic CS5345 audio ADC"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the Cirrus Logic CS5345 24-bit, 192 kHz
|
||||
stereo A/D converter.
|
||||
|
||||
|
|
@ -118,7 +119,7 @@ config VIDEO_CS5345
|
|||
config VIDEO_CS53L32A
|
||||
tristate "Cirrus Logic CS53L32A audio ADC"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the Cirrus Logic CS53L32A low voltage
|
||||
stereo A/D converter.
|
||||
|
||||
|
|
@ -128,7 +129,7 @@ config VIDEO_CS53L32A
|
|||
config VIDEO_TLV320AIC23B
|
||||
tristate "Texas Instruments TLV320AIC23B audio codec"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the Texas Instruments TLV320AIC23B audio codec.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -137,7 +138,7 @@ config VIDEO_TLV320AIC23B
|
|||
config VIDEO_UDA1342
|
||||
tristate "Philips UDA1342 audio codec"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the Philips UDA1342 audio codec.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -146,7 +147,7 @@ config VIDEO_UDA1342
|
|||
config VIDEO_WM8775
|
||||
tristate "Wolfson Microelectronics WM8775 audio ADC with input mixer"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the Wolfson Microelectronics WM8775 high
|
||||
performance stereo A/D Converter with a 4 channel input mixer.
|
||||
|
||||
|
|
@ -156,7 +157,7 @@ config VIDEO_WM8775
|
|||
config VIDEO_WM8739
|
||||
tristate "Wolfson Microelectronics WM8739 stereo audio ADC"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the Wolfson Microelectronics WM8739
|
||||
stereo A/D Converter.
|
||||
|
||||
|
|
@ -166,7 +167,7 @@ config VIDEO_WM8739
|
|||
config VIDEO_VP27SMPX
|
||||
tristate "Panasonic VP27's internal MPX"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the internal MPX of the Panasonic VP27s tuner.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -200,7 +201,7 @@ comment "Video decoders"
|
|||
config VIDEO_ADV7180
|
||||
tristate "Analog Devices ADV7180 decoder"
|
||||
depends on GPIOLIB && VIDEO_V4L2 && I2C && VIDEO_V4L2_SUBDEV_API
|
||||
---help---
|
||||
help
|
||||
Support for the Analog Devices ADV7180 video decoder.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -209,7 +210,7 @@ config VIDEO_ADV7180
|
|||
config VIDEO_ADV7183
|
||||
tristate "Analog Devices ADV7183 decoder"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
V4l2 subdevice driver for the Analog Devices
|
||||
ADV7183 video decoder.
|
||||
|
||||
|
|
@ -221,7 +222,8 @@ config VIDEO_ADV748X
|
|||
depends on VIDEO_V4L2 && I2C && VIDEO_V4L2_SUBDEV_API
|
||||
depends on OF
|
||||
select REGMAP_I2C
|
||||
---help---
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
V4L2 subdevice driver for the Analog Devices
|
||||
ADV7481 and ADV7482 HDMI/Analog video decoders.
|
||||
|
||||
|
|
@ -234,7 +236,7 @@ config VIDEO_ADV7604
|
|||
depends on GPIOLIB || COMPILE_TEST
|
||||
select HDMI
|
||||
select V4L2_FWNODE
|
||||
---help---
|
||||
help
|
||||
Support for the Analog Devices ADV7604 video decoder.
|
||||
|
||||
This is a Analog Devices Component/Graphics Digitizer
|
||||
|
|
@ -247,7 +249,7 @@ config VIDEO_ADV7604_CEC
|
|||
bool "Enable Analog Devices ADV7604 CEC support"
|
||||
depends on VIDEO_ADV7604
|
||||
select CEC_CORE
|
||||
---help---
|
||||
help
|
||||
When selected the adv7604 will support the optional
|
||||
HDMI CEC feature.
|
||||
|
||||
|
|
@ -255,7 +257,7 @@ config VIDEO_ADV7842
|
|||
tristate "Analog Devices ADV7842 decoder"
|
||||
depends on VIDEO_V4L2 && I2C && VIDEO_V4L2_SUBDEV_API
|
||||
select HDMI
|
||||
---help---
|
||||
help
|
||||
Support for the Analog Devices ADV7842 video decoder.
|
||||
|
||||
This is a Analog Devices Component/Graphics/SD Digitizer
|
||||
|
|
@ -268,14 +270,14 @@ config VIDEO_ADV7842_CEC
|
|||
bool "Enable Analog Devices ADV7842 CEC support"
|
||||
depends on VIDEO_ADV7842
|
||||
select CEC_CORE
|
||||
---help---
|
||||
help
|
||||
When selected the adv7842 will support the optional
|
||||
HDMI CEC feature.
|
||||
|
||||
config VIDEO_BT819
|
||||
tristate "BT819A VideoStream decoder"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for BT819A video decoder.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -284,7 +286,7 @@ config VIDEO_BT819
|
|||
config VIDEO_BT856
|
||||
tristate "BT856 VideoStream decoder"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for BT856 video decoder.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -293,7 +295,7 @@ config VIDEO_BT856
|
|||
config VIDEO_BT866
|
||||
tristate "BT866 VideoStream decoder"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for BT866 video decoder.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -302,7 +304,7 @@ config VIDEO_BT866
|
|||
config VIDEO_KS0127
|
||||
tristate "KS0127 video decoder"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for KS0127 video decoder.
|
||||
|
||||
This chip is used on AverMedia AVS6EYES Zoran-based MJPEG
|
||||
|
|
@ -314,53 +316,16 @@ config VIDEO_KS0127
|
|||
config VIDEO_ML86V7667
|
||||
tristate "OKI ML86V7667 video decoder"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the OKI Semiconductor ML86V7667 video decoder.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called ml86v7667.
|
||||
|
||||
config VIDEO_AD5820
|
||||
tristate "AD5820 lens voice coil support"
|
||||
depends on I2C && VIDEO_V4L2 && MEDIA_CONTROLLER
|
||||
---help---
|
||||
This is a driver for the AD5820 camera lens voice coil.
|
||||
It is used for example in Nokia N900 (RX-51).
|
||||
|
||||
config VIDEO_AK7375
|
||||
tristate "AK7375 lens voice coil support"
|
||||
depends on I2C && VIDEO_V4L2 && MEDIA_CONTROLLER
|
||||
depends on VIDEO_V4L2_SUBDEV_API
|
||||
help
|
||||
This is a driver for the AK7375 camera lens voice coil.
|
||||
AK7375 is a 12 bit DAC with 120mA output current sink
|
||||
capability. This is designed for linear control of
|
||||
voice coil motors, controlled via I2C serial interface.
|
||||
|
||||
config VIDEO_DW9714
|
||||
tristate "DW9714 lens voice coil support"
|
||||
depends on I2C && VIDEO_V4L2 && MEDIA_CONTROLLER
|
||||
depends on VIDEO_V4L2_SUBDEV_API
|
||||
---help---
|
||||
This is a driver for the DW9714 camera lens voice coil.
|
||||
DW9714 is a 10 bit DAC with 120mA output current sink
|
||||
capability. This is designed for linear control of
|
||||
voice coil motors, controlled via I2C serial interface.
|
||||
|
||||
config VIDEO_DW9807_VCM
|
||||
tristate "DW9807 lens voice coil support"
|
||||
depends on I2C && VIDEO_V4L2 && MEDIA_CONTROLLER
|
||||
depends on VIDEO_V4L2_SUBDEV_API
|
||||
---help---
|
||||
This is a driver for the DW9807 camera lens voice coil.
|
||||
DW9807 is a 10 bit DAC with 100mA output current sink
|
||||
capability. This is designed for linear control of
|
||||
voice coil motors, controlled via I2C serial interface.
|
||||
|
||||
config VIDEO_SAA7110
|
||||
tristate "Philips SAA7110 video decoder"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the Philips SAA7110 video decoders.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -369,7 +334,7 @@ config VIDEO_SAA7110
|
|||
config VIDEO_SAA711X
|
||||
tristate "Philips SAA7111/3/4/5 video decoders"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the Philips SAA7111/3/4/5 video decoders.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -380,7 +345,7 @@ config VIDEO_TC358743
|
|||
depends on VIDEO_V4L2 && I2C && VIDEO_V4L2_SUBDEV_API
|
||||
select HDMI
|
||||
select V4L2_FWNODE
|
||||
---help---
|
||||
help
|
||||
Support for the Toshiba TC358743 HDMI to MIPI CSI-2 bridge.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -390,7 +355,7 @@ config VIDEO_TC358743_CEC
|
|||
bool "Enable Toshiba TC358743 CEC support"
|
||||
depends on VIDEO_TC358743
|
||||
select CEC_CORE
|
||||
---help---
|
||||
help
|
||||
When selected the tc358743 will support the optional
|
||||
HDMI CEC feature.
|
||||
|
||||
|
|
@ -398,7 +363,7 @@ config VIDEO_TVP514X
|
|||
tristate "Texas Instruments TVP514x video decoder"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
select V4L2_FWNODE
|
||||
---help---
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the TI TVP5146/47
|
||||
decoder. It is currently working with the TI OMAP3 camera
|
||||
controller.
|
||||
|
|
@ -410,7 +375,7 @@ config VIDEO_TVP5150
|
|||
tristate "Texas Instruments TVP5150 video decoder"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
select V4L2_FWNODE
|
||||
---help---
|
||||
help
|
||||
Support for the Texas Instruments TVP5150 video decoder.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -420,7 +385,7 @@ config VIDEO_TVP7002
|
|||
tristate "Texas Instruments TVP7002 video decoder"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
select V4L2_FWNODE
|
||||
---help---
|
||||
help
|
||||
Support for the Texas Instruments TVP7002 video decoder.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -429,7 +394,7 @@ config VIDEO_TVP7002
|
|||
config VIDEO_TW2804
|
||||
tristate "Techwell TW2804 multiple video decoder"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the Techwell tw2804 multiple video decoder.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -438,7 +403,7 @@ config VIDEO_TW2804
|
|||
config VIDEO_TW9903
|
||||
tristate "Techwell TW9903 video decoder"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the Techwell tw9903 multi-standard video decoder
|
||||
with high quality down scaler.
|
||||
|
||||
|
|
@ -448,7 +413,7 @@ config VIDEO_TW9903
|
|||
config VIDEO_TW9906
|
||||
tristate "Techwell TW9906 video decoder"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the Techwell tw9906 enhanced multi-standard comb filter
|
||||
video decoder with YCbCr input support.
|
||||
|
||||
|
|
@ -458,7 +423,7 @@ config VIDEO_TW9906
|
|||
config VIDEO_TW9910
|
||||
tristate "Techwell TW9910 video decoder"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for Techwell TW9910 NTSC/PAL/SECAM video decoder.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -467,7 +432,7 @@ config VIDEO_TW9910
|
|||
config VIDEO_VPX3220
|
||||
tristate "vpx3220a, vpx3216b & vpx3214c video decoders"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for VPX322x video decoders.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -478,7 +443,7 @@ comment "Video and audio decoders"
|
|||
config VIDEO_SAA717X
|
||||
tristate "Philips SAA7171/3/4 audio/video decoders"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the Philips SAA7171/3/4 audio/video decoders.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -491,7 +456,7 @@ comment "Video encoders"
|
|||
config VIDEO_SAA7127
|
||||
tristate "Philips SAA7127/9 digital video encoders"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the Philips SAA7127/9 digital video encoders.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -500,7 +465,7 @@ config VIDEO_SAA7127
|
|||
config VIDEO_SAA7185
|
||||
tristate "Philips SAA7185 video encoder"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the Philips SAA7185 video encoder.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -509,7 +474,7 @@ config VIDEO_SAA7185
|
|||
config VIDEO_ADV7170
|
||||
tristate "Analog Devices ADV7170 video encoder"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the Analog Devices ADV7170 video encoder driver
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -518,7 +483,7 @@ config VIDEO_ADV7170
|
|||
config VIDEO_ADV7175
|
||||
tristate "Analog Devices ADV7175 video encoder"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the Analog Devices ADV7175 video encoder driver
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -546,7 +511,7 @@ config VIDEO_ADV7511
|
|||
tristate "Analog Devices ADV7511 encoder"
|
||||
depends on VIDEO_V4L2 && I2C && VIDEO_V4L2_SUBDEV_API
|
||||
select HDMI
|
||||
---help---
|
||||
help
|
||||
Support for the Analog Devices ADV7511 video encoder.
|
||||
|
||||
This is a Analog Devices HDMI transmitter.
|
||||
|
|
@ -558,14 +523,14 @@ config VIDEO_ADV7511_CEC
|
|||
bool "Enable Analog Devices ADV7511 CEC support"
|
||||
depends on VIDEO_ADV7511
|
||||
select CEC_CORE
|
||||
---help---
|
||||
help
|
||||
When selected the adv7511 will support the optional
|
||||
HDMI CEC feature.
|
||||
|
||||
config VIDEO_AD9389B
|
||||
tristate "Analog Devices AD9389B encoder"
|
||||
depends on VIDEO_V4L2 && I2C && VIDEO_V4L2_SUBDEV_API
|
||||
---help---
|
||||
help
|
||||
Support for the Analog Devices AD9389B video encoder.
|
||||
|
||||
This is a Analog Devices HDMI transmitter.
|
||||
|
|
@ -582,7 +547,7 @@ config VIDEO_AK881X
|
|||
config VIDEO_THS8200
|
||||
tristate "Texas Instruments THS8200 video encoder"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the Texas Instruments THS8200 video encoder.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -612,7 +577,7 @@ config VIDEO_IMX258
|
|||
tristate "Sony IMX258 sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
---help---
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the Sony
|
||||
IMX258 camera.
|
||||
|
||||
|
|
@ -624,7 +589,7 @@ config VIDEO_IMX274
|
|||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select REGMAP_I2C
|
||||
---help---
|
||||
help
|
||||
This is a V4L2 sensor driver for the Sony IMX274
|
||||
CMOS image sensor.
|
||||
|
||||
|
|
@ -666,7 +631,7 @@ config VIDEO_OV2659
|
|||
depends on VIDEO_V4L2 && I2C
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select V4L2_FWNODE
|
||||
---help---
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
OV2659 camera.
|
||||
|
||||
|
|
@ -678,7 +643,7 @@ config VIDEO_OV2680
|
|||
depends on VIDEO_V4L2 && I2C && MEDIA_CONTROLLER
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select V4L2_FWNODE
|
||||
---help---
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
OV2680 camera.
|
||||
|
||||
|
|
@ -690,7 +655,7 @@ config VIDEO_OV2685
|
|||
depends on VIDEO_V4L2 && I2C && MEDIA_CONTROLLER
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select V4L2_FWNODE
|
||||
---help---
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
OV2685 camera.
|
||||
|
||||
|
|
@ -703,7 +668,7 @@ config VIDEO_OV5640
|
|||
depends on GPIOLIB && VIDEO_V4L2 && I2C && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select V4L2_FWNODE
|
||||
---help---
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the Omnivision
|
||||
OV5640 camera sensor with a MIPI CSI-2 interface.
|
||||
|
||||
|
|
@ -713,7 +678,7 @@ config VIDEO_OV5645
|
|||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select V4L2_FWNODE
|
||||
---help---
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
OV5645 camera.
|
||||
|
||||
|
|
@ -725,7 +690,7 @@ config VIDEO_OV5647
|
|||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select V4L2_FWNODE
|
||||
---help---
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
OV5647 camera.
|
||||
|
||||
|
|
@ -736,7 +701,7 @@ config VIDEO_OV6650
|
|||
tristate "OmniVision OV6650 sensor support"
|
||||
depends on I2C && VIDEO_V4L2
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
---help---
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
OV6650 camera.
|
||||
|
||||
|
|
@ -749,7 +714,7 @@ config VIDEO_OV5670
|
|||
depends on MEDIA_CAMERA_SUPPORT
|
||||
depends on MEDIA_CONTROLLER
|
||||
select V4L2_FWNODE
|
||||
---help---
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
OV5670 camera.
|
||||
|
||||
|
|
@ -760,7 +725,7 @@ config VIDEO_OV5695
|
|||
tristate "OmniVision OV5695 sensor support"
|
||||
depends on I2C && VIDEO_V4L2
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
---help---
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
OV5695 camera.
|
||||
|
||||
|
|
@ -784,7 +749,7 @@ config VIDEO_OV772X
|
|||
depends on I2C && VIDEO_V4L2
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select REGMAP_SCCB
|
||||
---help---
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
OV772x camera.
|
||||
|
||||
|
|
@ -795,7 +760,7 @@ config VIDEO_OV7640
|
|||
tristate "OmniVision OV7640 sensor support"
|
||||
depends on I2C && VIDEO_V4L2
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
---help---
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
OV7640 camera.
|
||||
|
||||
|
|
@ -807,7 +772,7 @@ config VIDEO_OV7670
|
|||
depends on I2C && VIDEO_V4L2
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select V4L2_FWNODE
|
||||
---help---
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
OV7670 VGA camera. It currently only works with the M88ALP01
|
||||
controller.
|
||||
|
|
@ -816,7 +781,7 @@ config VIDEO_OV7740
|
|||
tristate "OmniVision OV7740 sensor support"
|
||||
depends on I2C && VIDEO_V4L2
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
---help---
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
OV7740 VGA camera sensor.
|
||||
|
||||
|
|
@ -843,7 +808,7 @@ config VIDEO_OV9650
|
|||
tristate "OmniVision OV9650/OV9652 sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
select REGMAP_SCCB
|
||||
---help---
|
||||
help
|
||||
This is a V4L2 sensor driver for the Omnivision
|
||||
OV9650 and OV9652 camera sensors.
|
||||
|
||||
|
|
@ -852,7 +817,7 @@ config VIDEO_OV13858
|
|||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select V4L2_FWNODE
|
||||
---help---
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
OV13858 camera.
|
||||
|
||||
|
|
@ -860,7 +825,7 @@ config VIDEO_VS6624
|
|||
tristate "ST VS6624 sensor support"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
---help---
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the ST VS6624
|
||||
camera.
|
||||
|
||||
|
|
@ -880,7 +845,7 @@ config VIDEO_MT9M032
|
|||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select VIDEO_APTINA_PLL
|
||||
---help---
|
||||
help
|
||||
This driver supports MT9M032 camera sensors from Aptina, monochrome
|
||||
models only.
|
||||
|
||||
|
|
@ -897,7 +862,7 @@ config VIDEO_MT9P031
|
|||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select VIDEO_APTINA_PLL
|
||||
---help---
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the Aptina
|
||||
(Micron) mt9p031 5 Mpixel camera.
|
||||
|
||||
|
|
@ -905,7 +870,7 @@ config VIDEO_MT9T001
|
|||
tristate "Aptina MT9T001 support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
---help---
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the Aptina
|
||||
(Micron) mt0t001 3 Mpixel camera.
|
||||
|
||||
|
|
@ -913,7 +878,7 @@ config VIDEO_MT9T112
|
|||
tristate "Aptina MT9T111/MT9T112 support"
|
||||
depends on I2C && VIDEO_V4L2
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
---help---
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the Aptina
|
||||
(Micron) MT9T111 and MT9T112 3 Mpixel camera.
|
||||
|
||||
|
|
@ -924,7 +889,7 @@ config VIDEO_MT9V011
|
|||
tristate "Micron mt9v011 sensor support"
|
||||
depends on I2C && VIDEO_V4L2
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
---help---
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the Micron
|
||||
mt0v011 1.3 Mpixel camera. It currently only works with the
|
||||
em28xx driver.
|
||||
|
|
@ -935,7 +900,7 @@ config VIDEO_MT9V032
|
|||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select REGMAP_I2C
|
||||
select V4L2_FWNODE
|
||||
---help---
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the Micron
|
||||
MT9V032 752x480 CMOS sensor.
|
||||
|
||||
|
|
@ -954,14 +919,14 @@ config VIDEO_SR030PC30
|
|||
tristate "Siliconfile SR030PC30 sensor support"
|
||||
depends on I2C && VIDEO_V4L2
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
---help---
|
||||
help
|
||||
This driver supports SR030PC30 VGA camera from Siliconfile
|
||||
|
||||
config VIDEO_NOON010PC30
|
||||
tristate "Siliconfile NOON010PC30 sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
---help---
|
||||
help
|
||||
This driver supports NOON010PC30 CIF camera from Siliconfile
|
||||
|
||||
source "drivers/media/i2c/m5mols/Kconfig"
|
||||
|
|
@ -981,7 +946,7 @@ config VIDEO_S5K6AA
|
|||
tristate "Samsung S5K6AAFX sensor support"
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
---help---
|
||||
help
|
||||
This is a V4L2 sensor driver for Samsung S5K6AA(FX) 1.3M
|
||||
camera sensor with an embedded SoC image signal processor.
|
||||
|
||||
|
|
@ -989,7 +954,7 @@ config VIDEO_S5K6A3
|
|||
tristate "Samsung S5K6A3 sensor support"
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
---help---
|
||||
help
|
||||
This is a V4L2 sensor driver for Samsung S5K6A3 raw
|
||||
camera sensor.
|
||||
|
||||
|
|
@ -997,7 +962,7 @@ config VIDEO_S5K4ECGX
|
|||
tristate "Samsung S5K4ECGX sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
select CRC32
|
||||
---help---
|
||||
help
|
||||
This is a V4L2 sensor driver for Samsung S5K4ECGX 5M
|
||||
camera sensor with an embedded SoC image signal processor.
|
||||
|
||||
|
|
@ -1005,7 +970,7 @@ config VIDEO_S5K5BAF
|
|||
tristate "Samsung S5K5BAF sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
select V4L2_FWNODE
|
||||
---help---
|
||||
help
|
||||
This is a V4L2 sensor driver for Samsung S5K5BAF 2M
|
||||
camera sensor with an embedded SoC image signal processor.
|
||||
|
||||
|
|
@ -1016,17 +981,56 @@ config VIDEO_S5C73M3
|
|||
tristate "Samsung S5C73M3 sensor support"
|
||||
depends on I2C && SPI && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
select V4L2_FWNODE
|
||||
---help---
|
||||
help
|
||||
This is a V4L2 sensor driver for Samsung S5C73M3
|
||||
8 Mpixel camera.
|
||||
|
||||
comment "Lens drivers"
|
||||
|
||||
config VIDEO_AD5820
|
||||
tristate "AD5820 lens voice coil support"
|
||||
depends on I2C && VIDEO_V4L2 && MEDIA_CONTROLLER
|
||||
help
|
||||
This is a driver for the AD5820 camera lens voice coil.
|
||||
It is used for example in Nokia N900 (RX-51).
|
||||
|
||||
config VIDEO_AK7375
|
||||
tristate "AK7375 lens voice coil support"
|
||||
depends on I2C && VIDEO_V4L2 && MEDIA_CONTROLLER
|
||||
depends on VIDEO_V4L2_SUBDEV_API
|
||||
help
|
||||
This is a driver for the AK7375 camera lens voice coil.
|
||||
AK7375 is a 12 bit DAC with 120mA output current sink
|
||||
capability. This is designed for linear control of
|
||||
voice coil motors, controlled via I2C serial interface.
|
||||
|
||||
config VIDEO_DW9714
|
||||
tristate "DW9714 lens voice coil support"
|
||||
depends on I2C && VIDEO_V4L2 && MEDIA_CONTROLLER
|
||||
depends on VIDEO_V4L2_SUBDEV_API
|
||||
help
|
||||
This is a driver for the DW9714 camera lens voice coil.
|
||||
DW9714 is a 10 bit DAC with 120mA output current sink
|
||||
capability. This is designed for linear control of
|
||||
voice coil motors, controlled via I2C serial interface.
|
||||
|
||||
config VIDEO_DW9807_VCM
|
||||
tristate "DW9807 lens voice coil support"
|
||||
depends on I2C && VIDEO_V4L2 && MEDIA_CONTROLLER
|
||||
depends on VIDEO_V4L2_SUBDEV_API
|
||||
help
|
||||
This is a driver for the DW9807 camera lens voice coil.
|
||||
DW9807 is a 10 bit DAC with 100mA output current sink
|
||||
capability. This is designed for linear control of
|
||||
voice coil motors, controlled via I2C serial interface.
|
||||
|
||||
comment "Flash devices"
|
||||
|
||||
config VIDEO_ADP1653
|
||||
tristate "ADP1653 flash support"
|
||||
depends on I2C && VIDEO_V4L2 && MEDIA_CONTROLLER
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
---help---
|
||||
help
|
||||
This is a driver for the ADP1653 flash controller. It is used for
|
||||
example in Nokia N900.
|
||||
|
||||
|
|
@ -1035,7 +1039,7 @@ config VIDEO_LM3560
|
|||
depends on I2C && VIDEO_V4L2 && MEDIA_CONTROLLER
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select REGMAP_I2C
|
||||
---help---
|
||||
help
|
||||
This is a driver for the lm3560 dual flash controllers. It controls
|
||||
flash, torch LEDs.
|
||||
|
||||
|
|
@ -1044,7 +1048,7 @@ config VIDEO_LM3646
|
|||
depends on I2C && VIDEO_V4L2 && MEDIA_CONTROLLER
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select REGMAP_I2C
|
||||
---help---
|
||||
help
|
||||
This is a driver for the lm3646 dual flash controllers. It controls
|
||||
flash, torch LEDs.
|
||||
|
||||
|
|
@ -1053,7 +1057,7 @@ comment "Video improvement chips"
|
|||
config VIDEO_UPD64031A
|
||||
tristate "NEC Electronics uPD64031A Ghost Reduction"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the NEC Electronics uPD64031A Ghost Reduction
|
||||
video chip. It is most often found in NTSC TV cards made for
|
||||
Japan and is used to reduce the 'ghosting' effect that can
|
||||
|
|
@ -1065,7 +1069,7 @@ config VIDEO_UPD64031A
|
|||
config VIDEO_UPD64083
|
||||
tristate "NEC Electronics uPD64083 3-Dimensional Y/C separation"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the NEC Electronics uPD64083 3-Dimensional Y/C
|
||||
separation video chip. It is used to improve the quality of
|
||||
the colors of a composite signal.
|
||||
|
|
@ -1079,7 +1083,7 @@ config VIDEO_SAA6752HS
|
|||
tristate "Philips SAA6752HS MPEG-2 Audio/Video Encoder"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
select CRC32
|
||||
---help---
|
||||
help
|
||||
Support for the Philips SAA6752HS MPEG-2 video and MPEG-audio/AC-3
|
||||
audio encoder with multiplexer.
|
||||
|
||||
|
|
@ -1091,7 +1095,7 @@ comment "SDR tuner chips"
|
|||
config SDR_MAX2175
|
||||
tristate "Maxim 2175 RF to Bits tuner"
|
||||
depends on VIDEO_V4L2 && MEDIA_SDR_SUPPORT && I2C
|
||||
---help---
|
||||
help
|
||||
Support for Maxim 2175 tuner. It is an advanced analog/digital
|
||||
radio receiver with RF-to-Bits front-end designed for SDR solutions.
|
||||
|
||||
|
|
@ -1112,7 +1116,7 @@ config VIDEO_THS7303
|
|||
config VIDEO_M52790
|
||||
tristate "Mitsubishi M52790 A/V switch"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the Mitsubishi M52790 A/V switch.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
@ -1123,7 +1127,7 @@ config VIDEO_I2C
|
|||
depends on VIDEO_V4L2 && I2C
|
||||
select VIDEOBUF2_VMALLOC
|
||||
imply HWMON
|
||||
---help---
|
||||
help
|
||||
Enable the I2C transport video support which supports the
|
||||
following:
|
||||
* Panasonic AMG88xx Grid-Eye Sensors
|
||||
|
|
@ -1132,6 +1136,19 @@ config VIDEO_I2C
|
|||
To compile this driver as a module, choose M here: the
|
||||
module will be called video-i2c
|
||||
|
||||
config VIDEO_ST_MIPID02
|
||||
tristate "STMicroelectronics MIPID02 CSI-2 to PARALLEL bridge"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
Support for STMicroelectronics MIPID02 CSI-2 to PARALLEL bridge.
|
||||
It is used to allow usage of CSI-2 sensor with PARALLEL port
|
||||
controller.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called st-mipid02.
|
||||
|
||||
endmenu
|
||||
|
||||
endif
|
||||
|
|
|
|||
|
|
@ -113,5 +113,6 @@ obj-$(CONFIG_VIDEO_IMX258) += imx258.o
|
|||
obj-$(CONFIG_VIDEO_IMX274) += imx274.o
|
||||
obj-$(CONFIG_VIDEO_IMX319) += imx319.o
|
||||
obj-$(CONFIG_VIDEO_IMX355) += imx355.o
|
||||
obj-$(CONFIG_VIDEO_ST_MIPID02) += st-mipid02.o
|
||||
|
||||
obj-$(CONFIG_SDR_MAX2175) += max2175.o
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
config VIDEO_CX25840
|
||||
tristate "Conexant CX2584x audio/video decoders"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
---help---
|
||||
help
|
||||
Support for the Conexant CX2584x audio/video decoders.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
|
|||
|
|
@ -2,6 +2,6 @@ config VIDEO_ET8EK8
|
|||
tristate "ET8EK8 camera sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
select V4L2_FWNODE
|
||||
---help---
|
||||
help
|
||||
This is a driver for the Toshiba ET8EK8 5 MP camera sensor.
|
||||
It is used for example in Nokia N900 (RX-51).
|
||||
|
|
|
|||
|
|
@ -588,12 +588,10 @@ static int imx214_set_format(struct v4l2_subdev *sd,
|
|||
|
||||
__crop = __imx214_get_pad_crop(imx214, cfg, format->pad, format->which);
|
||||
|
||||
if (format)
|
||||
mode = v4l2_find_nearest_size(imx214_modes,
|
||||
ARRAY_SIZE(imx214_modes), width, height,
|
||||
format->format.width, format->format.height);
|
||||
else
|
||||
mode = &imx214_modes[0];
|
||||
mode = v4l2_find_nearest_size(imx214_modes,
|
||||
ARRAY_SIZE(imx214_modes), width, height,
|
||||
format->format.width,
|
||||
format->format.height);
|
||||
|
||||
__crop->width = mode->width;
|
||||
__crop->height = mode->height;
|
||||
|
|
|
|||
|
|
@ -2,5 +2,5 @@ config VIDEO_M5MOLS
|
|||
tristate "Fujitsu M-5MOLS 8MP sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
---help---
|
||||
help
|
||||
This driver supports Fujitsu M-5MOLS camera sensor with ISP
|
||||
|
|
|
|||
|
|
@ -1117,8 +1117,10 @@ static int ov2659_set_fmt(struct v4l2_subdev *sd,
|
|||
if (ov2659_formats[index].code == mf->code)
|
||||
break;
|
||||
|
||||
if (index < 0)
|
||||
return -EINVAL;
|
||||
if (index < 0) {
|
||||
index = 0;
|
||||
mf->code = ov2659_formats[index].code;
|
||||
}
|
||||
|
||||
mf->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
mf->field = V4L2_FIELD_NONE;
|
||||
|
|
@ -1130,7 +1132,7 @@ static int ov2659_set_fmt(struct v4l2_subdev *sd,
|
|||
mf = v4l2_subdev_get_try_format(sd, cfg, fmt->pad);
|
||||
*mf = fmt->format;
|
||||
#else
|
||||
return -ENOTTY;
|
||||
ret = -ENOTTY;
|
||||
#endif
|
||||
} else {
|
||||
s64 val;
|
||||
|
|
|
|||
|
|
@ -804,15 +804,25 @@ static int ov6650_prog_dflt(struct i2c_client *client)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int ov6650_video_probe(struct i2c_client *client)
|
||||
static int ov6650_video_probe(struct v4l2_subdev *sd)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
struct ov6650 *priv = to_ov6650(client);
|
||||
u8 pidh, pidl, midh, midl;
|
||||
int ret;
|
||||
|
||||
ret = ov6650_s_power(&priv->subdev, 1);
|
||||
if (ret < 0)
|
||||
priv->clk = v4l2_clk_get(&client->dev, NULL);
|
||||
if (IS_ERR(priv->clk)) {
|
||||
ret = PTR_ERR(priv->clk);
|
||||
dev_err(&client->dev, "v4l2_clk request err: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = ov6650_s_power(sd, 1);
|
||||
if (ret < 0)
|
||||
goto eclkput;
|
||||
|
||||
msleep(20);
|
||||
|
||||
/*
|
||||
* check and show product ID and manufacturer ID
|
||||
|
|
@ -846,7 +856,12 @@ static int ov6650_video_probe(struct i2c_client *client)
|
|||
ret = v4l2_ctrl_handler_setup(&priv->hdl);
|
||||
|
||||
done:
|
||||
ov6650_s_power(&priv->subdev, 0);
|
||||
ov6650_s_power(sd, 0);
|
||||
if (!ret)
|
||||
return 0;
|
||||
eclkput:
|
||||
v4l2_clk_put(priv->clk);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -929,6 +944,10 @@ static const struct v4l2_subdev_ops ov6650_subdev_ops = {
|
|||
.pad = &ov6650_pad_ops,
|
||||
};
|
||||
|
||||
static const struct v4l2_subdev_internal_ops ov6650_internal_ops = {
|
||||
.registered = ov6650_video_probe,
|
||||
};
|
||||
|
||||
/*
|
||||
* i2c_driver function
|
||||
*/
|
||||
|
|
@ -989,18 +1008,12 @@ static int ov6650_probe(struct i2c_client *client,
|
|||
priv->code = MEDIA_BUS_FMT_YUYV8_2X8;
|
||||
priv->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
|
||||
priv->clk = v4l2_clk_get(&client->dev, NULL);
|
||||
if (IS_ERR(priv->clk)) {
|
||||
ret = PTR_ERR(priv->clk);
|
||||
goto eclkget;
|
||||
}
|
||||
priv->subdev.internal_ops = &ov6650_internal_ops;
|
||||
priv->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
|
||||
|
||||
ret = ov6650_video_probe(client);
|
||||
if (ret) {
|
||||
v4l2_clk_put(priv->clk);
|
||||
eclkget:
|
||||
ret = v4l2_async_register_subdev(&priv->subdev);
|
||||
if (ret)
|
||||
v4l2_ctrl_handler_free(&priv->hdl);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1010,7 +1023,7 @@ static int ov6650_remove(struct i2c_client *client)
|
|||
struct ov6650 *priv = to_ov6650(client);
|
||||
|
||||
v4l2_clk_put(priv->clk);
|
||||
v4l2_device_unregister_subdev(&priv->subdev);
|
||||
v4l2_async_unregister_subdev(&priv->subdev);
|
||||
v4l2_ctrl_handler_free(&priv->hdl);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -864,7 +864,15 @@ static int ov7675_set_framerate(struct v4l2_subdev *sd,
|
|||
/* Recalculate frame rate */
|
||||
ov7675_get_framerate(sd, tpf);
|
||||
|
||||
return ov7675_apply_framerate(sd);
|
||||
/*
|
||||
* If the device is not powered up by the host driver do
|
||||
* not apply any changes to H/W at this time. Instead
|
||||
* the framerate will be restored right after power-up.
|
||||
*/
|
||||
if (info->on)
|
||||
return ov7675_apply_framerate(sd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ov7670_get_framerate_legacy(struct v4l2_subdev *sd,
|
||||
|
|
@ -895,7 +903,16 @@ static int ov7670_set_framerate_legacy(struct v4l2_subdev *sd,
|
|||
info->clkrc = (info->clkrc & 0x80) | div;
|
||||
tpf->numerator = 1;
|
||||
tpf->denominator = info->clock_speed / div;
|
||||
return ov7670_write(sd, REG_CLKRC, info->clkrc);
|
||||
|
||||
/*
|
||||
* If the device is not powered up by the host driver do
|
||||
* not apply any changes to H/W at this time. Instead
|
||||
* the framerate will be restored right after power-up.
|
||||
*/
|
||||
if (info->on)
|
||||
return ov7670_write(sd, REG_CLKRC, info->clkrc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -1105,9 +1122,13 @@ static int ov7670_set_fmt(struct v4l2_subdev *sd,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = ov7670_apply_fmt(sd);
|
||||
if (ret)
|
||||
return ret;
|
||||
/*
|
||||
* If the device is not powered up by the host driver do
|
||||
* not apply any changes to H/W at this time. Instead
|
||||
* the frame format will be restored right after power-up.
|
||||
*/
|
||||
if (info->on)
|
||||
return ov7670_apply_fmt(sd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1664,6 +1685,7 @@ static int ov7670_s_power(struct v4l2_subdev *sd, int on)
|
|||
|
||||
if (on) {
|
||||
ov7670_power_on (sd);
|
||||
ov7670_init(sd, 0);
|
||||
ov7670_apply_fmt(sd);
|
||||
ov7675_apply_framerate(sd);
|
||||
v4l2_ctrl_handler_setup(&info->hdl);
|
||||
|
|
|
|||
|
|
@ -448,6 +448,27 @@ static int ov7740_get_gain(struct ov7740 *ov7740, struct v4l2_ctrl *ctrl)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int ov7740_get_exp(struct ov7740 *ov7740, struct v4l2_ctrl *ctrl)
|
||||
{
|
||||
struct regmap *regmap = ov7740->regmap;
|
||||
unsigned int value0, value1;
|
||||
int ret;
|
||||
|
||||
if (ctrl->val == V4L2_EXPOSURE_MANUAL)
|
||||
return 0;
|
||||
|
||||
ret = regmap_read(regmap, REG_AEC, &value0);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = regmap_read(regmap, REG_HAEC, &value1);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ov7740->exposure->val = (value1 << 8) | (value0 & 0xff);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ov7740_set_exp(struct regmap *regmap, int value)
|
||||
{
|
||||
int ret;
|
||||
|
|
@ -494,6 +515,9 @@ static int ov7740_get_volatile_ctrl(struct v4l2_ctrl *ctrl)
|
|||
case V4L2_CID_AUTOGAIN:
|
||||
ret = ov7740_get_gain(ov7740, ctrl);
|
||||
break;
|
||||
case V4L2_CID_EXPOSURE_AUTO:
|
||||
ret = ov7740_get_exp(ov7740, ctrl);
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
|
|
@ -991,8 +1015,6 @@ static int ov7740_init_controls(struct ov7740 *ov7740)
|
|||
|
||||
ov7740->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &ov7740_ctrl_ops,
|
||||
V4L2_CID_EXPOSURE, 0, 65535, 1, 500);
|
||||
if (ov7740->exposure)
|
||||
ov7740->exposure->flags |= V4L2_CTRL_FLAG_VOLATILE;
|
||||
|
||||
ov7740->auto_exposure = v4l2_ctrl_new_std_menu(ctrl_hdlr,
|
||||
&ov7740_ctrl_ops,
|
||||
|
|
@ -1003,7 +1025,7 @@ static int ov7740_init_controls(struct ov7740 *ov7740)
|
|||
v4l2_ctrl_auto_cluster(3, &ov7740->auto_wb, 0, false);
|
||||
v4l2_ctrl_auto_cluster(2, &ov7740->auto_gain, 0, true);
|
||||
v4l2_ctrl_auto_cluster(2, &ov7740->auto_exposure,
|
||||
V4L2_EXPOSURE_MANUAL, false);
|
||||
V4L2_EXPOSURE_MANUAL, true);
|
||||
v4l2_ctrl_cluster(2, &ov7740->hflip);
|
||||
|
||||
if (ctrl_hdlr->error) {
|
||||
|
|
|
|||
|
|
@ -4,5 +4,5 @@ config VIDEO_SMIAPP
|
|||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select VIDEO_SMIAPP_PLL
|
||||
select V4L2_FWNODE
|
||||
---help---
|
||||
help
|
||||
This is a generic driver for SMIA++/SMIA camera modules.
|
||||
|
|
|
|||
1033
drivers/media/i2c/st-mipid02.c
Normal file
1033
drivers/media/i2c/st-mipid02.c
Normal file
File diff suppressed because it is too large
Load diff
135
drivers/media/media-dev-allocator.c
Normal file
135
drivers/media/media-dev-allocator.c
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* media-dev-allocator.c - Media Controller Device Allocator API
|
||||
*
|
||||
* Copyright (c) 2019 Shuah Khan <shuah@kernel.org>
|
||||
*
|
||||
* Credits: Suggested by Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file adds a global refcounted Media Controller Device Instance API.
|
||||
* A system wide global media device list is managed and each media device
|
||||
* includes a kref count. The last put on the media device releases the media
|
||||
* device instance.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kref.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/usb.h>
|
||||
|
||||
#include <media/media-device.h>
|
||||
#include <media/media-dev-allocator.h>
|
||||
|
||||
static LIST_HEAD(media_device_list);
|
||||
static DEFINE_MUTEX(media_device_lock);
|
||||
|
||||
struct media_device_instance {
|
||||
struct media_device mdev;
|
||||
struct module *owner;
|
||||
struct list_head list;
|
||||
struct kref refcount;
|
||||
};
|
||||
|
||||
static inline struct media_device_instance *
|
||||
to_media_device_instance(struct media_device *mdev)
|
||||
{
|
||||
return container_of(mdev, struct media_device_instance, mdev);
|
||||
}
|
||||
|
||||
static void media_device_instance_release(struct kref *kref)
|
||||
{
|
||||
struct media_device_instance *mdi =
|
||||
container_of(kref, struct media_device_instance, refcount);
|
||||
|
||||
dev_dbg(mdi->mdev.dev, "%s: releasing Media Device\n", __func__);
|
||||
|
||||
mutex_lock(&media_device_lock);
|
||||
|
||||
media_device_unregister(&mdi->mdev);
|
||||
media_device_cleanup(&mdi->mdev);
|
||||
|
||||
list_del(&mdi->list);
|
||||
mutex_unlock(&media_device_lock);
|
||||
|
||||
kfree(mdi);
|
||||
}
|
||||
|
||||
/* Callers should hold media_device_lock when calling this function */
|
||||
static struct media_device *__media_device_get(struct device *dev,
|
||||
const char *module_name,
|
||||
struct module *owner)
|
||||
{
|
||||
struct media_device_instance *mdi;
|
||||
|
||||
list_for_each_entry(mdi, &media_device_list, list) {
|
||||
if (mdi->mdev.dev != dev)
|
||||
continue;
|
||||
|
||||
kref_get(&mdi->refcount);
|
||||
|
||||
/* get module reference for the media_device owner */
|
||||
if (owner != mdi->owner && !try_module_get(mdi->owner))
|
||||
dev_err(dev,
|
||||
"%s: module %s get owner reference error\n",
|
||||
__func__, module_name);
|
||||
else
|
||||
dev_dbg(dev, "%s: module %s got owner reference\n",
|
||||
__func__, module_name);
|
||||
return &mdi->mdev;
|
||||
}
|
||||
|
||||
mdi = kzalloc(sizeof(*mdi), GFP_KERNEL);
|
||||
if (!mdi)
|
||||
return NULL;
|
||||
|
||||
mdi->owner = owner;
|
||||
kref_init(&mdi->refcount);
|
||||
list_add_tail(&mdi->list, &media_device_list);
|
||||
|
||||
dev_dbg(dev, "%s: Allocated media device for owner %s\n",
|
||||
__func__, module_name);
|
||||
return &mdi->mdev;
|
||||
}
|
||||
|
||||
struct media_device *media_device_usb_allocate(struct usb_device *udev,
|
||||
const char *module_name,
|
||||
struct module *owner)
|
||||
{
|
||||
struct media_device *mdev;
|
||||
|
||||
mutex_lock(&media_device_lock);
|
||||
mdev = __media_device_get(&udev->dev, module_name, owner);
|
||||
if (!mdev) {
|
||||
mutex_unlock(&media_device_lock);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
/* check if media device is already initialized */
|
||||
if (!mdev->dev)
|
||||
__media_device_usb_init(mdev, udev, udev->product,
|
||||
module_name);
|
||||
mutex_unlock(&media_device_lock);
|
||||
return mdev;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(media_device_usb_allocate);
|
||||
|
||||
void media_device_delete(struct media_device *mdev, const char *module_name,
|
||||
struct module *owner)
|
||||
{
|
||||
struct media_device_instance *mdi = to_media_device_instance(mdev);
|
||||
|
||||
mutex_lock(&media_device_lock);
|
||||
/* put module reference for the media_device owner */
|
||||
if (mdi->owner != owner) {
|
||||
module_put(mdi->owner);
|
||||
dev_dbg(mdi->mdev.dev,
|
||||
"%s: module %s put owner module reference\n",
|
||||
__func__, module_name);
|
||||
}
|
||||
mutex_unlock(&media_device_lock);
|
||||
kref_put(&mdi->refcount, media_device_instance_release);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(media_device_delete);
|
||||
|
|
@ -251,6 +251,7 @@ int __must_check media_devnode_register(struct media_device *mdev,
|
|||
/* Part 2: Initialize the character device */
|
||||
cdev_init(&devnode->cdev, &media_devnode_fops);
|
||||
devnode->cdev.owner = owner;
|
||||
kobject_set_name(&devnode->cdev.kobj, "media%d", devnode->minor);
|
||||
|
||||
/* Part 3: Add the media and char device */
|
||||
ret = cdev_device_add(&devnode->cdev, &devnode->dev);
|
||||
|
|
@ -290,8 +291,9 @@ void media_devnode_unregister(struct media_devnode *devnode)
|
|||
mutex_lock(&media_devnode_lock);
|
||||
/* Delete the cdev on this minor as well */
|
||||
cdev_device_del(&devnode->cdev, &devnode->dev);
|
||||
mutex_unlock(&media_devnode_lock);
|
||||
devnode->media_dev = NULL;
|
||||
mutex_unlock(&media_devnode_lock);
|
||||
|
||||
put_device(&devnode->dev);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -17,7 +17,6 @@
|
|||
*/
|
||||
|
||||
#include <linux/bitmap.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/slab.h>
|
||||
#include <media/media-entity.h>
|
||||
|
|
@ -436,7 +435,10 @@ __must_check int __media_pipeline_start(struct media_entity *entity,
|
|||
|
||||
entity->stream_count++;
|
||||
|
||||
if (WARN_ON(entity->pipe && entity->pipe != pipe)) {
|
||||
if (entity->pipe && entity->pipe != pipe) {
|
||||
pr_err("Pipe active for %s. Can't start for %s\n",
|
||||
entity->name,
|
||||
entity_err->name);
|
||||
ret = -EBUSY;
|
||||
goto error;
|
||||
}
|
||||
|
|
@ -587,33 +589,6 @@ void media_pipeline_stop(struct media_entity *entity)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(media_pipeline_stop);
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
* Module use count
|
||||
*/
|
||||
|
||||
struct media_entity *media_entity_get(struct media_entity *entity)
|
||||
{
|
||||
if (entity == NULL)
|
||||
return NULL;
|
||||
|
||||
if (entity->graph_obj.mdev->dev &&
|
||||
!try_module_get(entity->graph_obj.mdev->dev->driver->owner))
|
||||
return NULL;
|
||||
|
||||
return entity;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(media_entity_get);
|
||||
|
||||
void media_entity_put(struct media_entity *entity)
|
||||
{
|
||||
if (entity == NULL)
|
||||
return;
|
||||
|
||||
if (entity->graph_obj.mdev->dev)
|
||||
module_put(entity->graph_obj.mdev->dev->driver->owner);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(media_entity_put);
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
* Links management
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -251,7 +251,7 @@ media_request_get_by_fd(struct media_device *mdev, int request_fd)
|
|||
|
||||
if (!mdev || !mdev->ops ||
|
||||
!mdev->ops->req_validate || !mdev->ops->req_queue)
|
||||
return ERR_PTR(-EACCES);
|
||||
return ERR_PTR(-EBADR);
|
||||
|
||||
f = fdget(request_fd);
|
||||
if (!f.file)
|
||||
|
|
@ -407,7 +407,7 @@ int media_request_object_bind(struct media_request *req,
|
|||
int ret = -EBUSY;
|
||||
|
||||
if (WARN_ON(!ops->release))
|
||||
return -EACCES;
|
||||
return -EBADR;
|
||||
|
||||
spin_lock_irqsave(&req->lock, flags);
|
||||
|
||||
|
|
|
|||
|
|
@ -9,5 +9,5 @@ config SMS_SDIO_DRV
|
|||
depends on !RC_CORE || RC_CORE
|
||||
select MEDIA_COMMON_OPTIONS
|
||||
select SMS_SIANO_MDTV
|
||||
---help---
|
||||
help
|
||||
Choose if you would like to have Siano's support for SDIO interface
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ config VIDEO_BT848
|
|||
select VIDEO_SAA6588 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select RADIO_ADAPTERS
|
||||
select RADIO_TEA575X
|
||||
---help---
|
||||
help
|
||||
Support for BT848 based frame grabber/overlay boards. This includes
|
||||
the Miro, Hauppauge and STB boards. Please read the material in
|
||||
<file:Documentation/media/v4l-drivers/bttv.rst> for more information.
|
||||
|
|
|
|||
|
|
@ -1100,7 +1100,8 @@ static int dst_get_device_id(struct dst_state *state)
|
|||
/* Card capabilities */
|
||||
state->dst_hw_cap = p_dst_type->dst_feature;
|
||||
pr_err("Recognise [%s]\n", p_dst_type->device_id);
|
||||
strncpy(&state->fw_name[0], p_dst_type->device_id, 6);
|
||||
strscpy(state->fw_name, p_dst_type->device_id,
|
||||
sizeof(state->fw_name));
|
||||
/* Multiple tuners */
|
||||
if (p_dst_type->tuner_type & TUNER_TYPE_MULTI) {
|
||||
switch (use_dst_type) {
|
||||
|
|
|
|||
|
|
@ -138,7 +138,7 @@ struct dst_state {
|
|||
u32 tuner_type;
|
||||
char *tuner_name;
|
||||
struct mutex dst_mutex;
|
||||
u8 fw_name[8];
|
||||
char fw_name[8];
|
||||
struct dvb_device *dst_ca;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ config VIDEO_COBALT
|
|||
select VIDEO_ADV7511
|
||||
select VIDEO_ADV7842
|
||||
select VIDEOBUF2_DMA_SG
|
||||
---help---
|
||||
help
|
||||
This is a video4linux driver for the Cisco PCIe Cobalt card.
|
||||
|
||||
This board is sadly not available outside of Cisco, but it is
|
||||
|
|
|
|||
|
|
@ -128,7 +128,7 @@ done:
|
|||
cb->vb.sequence = s->sequence++;
|
||||
vb2_buffer_done(&cb->vb.vb2_buf,
|
||||
(skip || s->unstable_frame) ?
|
||||
VB2_BUF_STATE_REQUEUEING : VB2_BUF_STATE_DONE);
|
||||
VB2_BUF_STATE_ERROR : VB2_BUF_STATE_DONE);
|
||||
}
|
||||
|
||||
irqreturn_t cobalt_irq_handler(int irq, void *dev_id)
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ config VIDEO_CX18
|
|||
select DVB_S5H1411 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select MEDIA_TUNER_TDA18271 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select MEDIA_TUNER_TDA8290 if MEDIA_SUBDRV_AUTOSELECT
|
||||
---help---
|
||||
help
|
||||
This is a video4linux driver for Conexant cx23418 based
|
||||
PCI combo video recorder devices.
|
||||
|
||||
|
|
@ -27,7 +27,7 @@ config VIDEO_CX18_ALSA
|
|||
tristate "Conexant 23418 DMA audio support"
|
||||
depends on VIDEO_CX18 && SND
|
||||
select SND_PCM
|
||||
---help---
|
||||
help
|
||||
This is a video4linux driver for direct (DMA) audio on
|
||||
Conexant 23418 based TV cards using ALSA.
|
||||
|
||||
|
|
|
|||
|
|
@ -484,7 +484,7 @@ static ssize_t cx18_read_pos(struct cx18_stream *s, char __user *ubuf,
|
|||
|
||||
CX18_DEBUG_HI_FILE("read %zd from %s, got %zd\n", count, s->name, rc);
|
||||
if (rc > 0)
|
||||
pos += rc;
|
||||
*pos += rc;
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ config VIDEO_CX23885
|
|||
select MEDIA_TUNER_SI2157 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select MEDIA_TUNER_M88RS6000T if MEDIA_SUBDRV_AUTOSELECT
|
||||
select DVB_TUNER_DIB0070 if MEDIA_SUBDRV_AUTOSELECT
|
||||
---help---
|
||||
help
|
||||
This is a video4linux driver for Conexant 23885 based
|
||||
TV cards.
|
||||
|
||||
|
|
@ -54,7 +54,7 @@ config MEDIA_ALTERA_CI
|
|||
tristate "Altera FPGA based CI module"
|
||||
depends on VIDEO_CX23885 && DVB_CORE
|
||||
select ALTERA_STAPL
|
||||
---help---
|
||||
help
|
||||
An Altera FPGA CI module for NetUP Dual DVB-T/C RF CI card.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
|
|||
|
|
@ -1474,8 +1474,9 @@ static int dvb_register(struct cx23885_tsport *port)
|
|||
if (fe0->dvb.frontend != NULL) {
|
||||
struct i2c_adapter *tun_i2c;
|
||||
|
||||
fe0->dvb.frontend->sec_priv = kmalloc(sizeof(dib7000p_ops), GFP_KERNEL);
|
||||
memcpy(fe0->dvb.frontend->sec_priv, &dib7000p_ops, sizeof(dib7000p_ops));
|
||||
fe0->dvb.frontend->sec_priv = kmemdup(&dib7000p_ops, sizeof(dib7000p_ops), GFP_KERNEL);
|
||||
if (!fe0->dvb.frontend->sec_priv)
|
||||
return -ENOMEM;
|
||||
tun_i2c = dib7000p_ops.get_i2c_master(fe0->dvb.frontend, DIBX000_I2C_INTERFACE_TUNER, 1);
|
||||
if (!dvb_attach(dib0070_attach, fe0->dvb.frontend, tun_i2c, &dib7070p_dib0070_config))
|
||||
return -ENODEV;
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ config VIDEO_CX25821
|
|||
depends on VIDEO_DEV && PCI && I2C
|
||||
select I2C_ALGOBIT
|
||||
select VIDEOBUF2_DMA_SG
|
||||
---help---
|
||||
help
|
||||
This is a video4linux driver for Conexant 25821 based
|
||||
TV cards.
|
||||
|
||||
|
|
@ -14,7 +14,7 @@ config VIDEO_CX25821_ALSA
|
|||
tristate "Conexant 25821 DMA audio support"
|
||||
depends on VIDEO_CX25821 && SND
|
||||
select SND_PCM
|
||||
---help---
|
||||
help
|
||||
This is a video4linux driver for direct (DMA) audio on
|
||||
Conexant 25821 based capture cards using ALSA.
|
||||
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ config VIDEO_CX88
|
|||
select VIDEO_TUNER
|
||||
select VIDEO_TVEEPROM
|
||||
select VIDEO_WM8775 if MEDIA_SUBDRV_AUTOSELECT
|
||||
---help---
|
||||
help
|
||||
This is a video4linux driver for Conexant 2388x based
|
||||
TV cards.
|
||||
|
||||
|
|
@ -17,7 +17,7 @@ config VIDEO_CX88_ALSA
|
|||
tristate "Conexant 2388x DMA audio support"
|
||||
depends on VIDEO_CX88 && SND
|
||||
select SND_PCM
|
||||
---help---
|
||||
help
|
||||
This is a video4linux driver for direct (DMA) audio on
|
||||
Conexant 2388x based TV cards using ALSA.
|
||||
|
||||
|
|
@ -33,7 +33,7 @@ config VIDEO_CX88_BLACKBIRD
|
|||
tristate "Blackbird MPEG encoder support (cx2388x + cx23416)"
|
||||
depends on VIDEO_CX88
|
||||
select VIDEO_CX2341X
|
||||
---help---
|
||||
help
|
||||
This adds support for MPEG encoder cards based on the
|
||||
Blackbird reference design, using the Conexant 2388x
|
||||
and 23416 chips.
|
||||
|
|
@ -64,7 +64,7 @@ config VIDEO_CX88_DVB
|
|||
select DVB_DS3000 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select DVB_TS2020 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select MEDIA_TUNER_SIMPLE if MEDIA_SUBDRV_AUTOSELECT
|
||||
---help---
|
||||
help
|
||||
This adds support for DVB/ATSC cards based on the
|
||||
Conexant 2388x chip.
|
||||
|
||||
|
|
@ -75,7 +75,7 @@ config VIDEO_CX88_ENABLE_VP3054
|
|||
bool "VP-3054 Secondary I2C Bus Support"
|
||||
default y
|
||||
depends on VIDEO_CX88_DVB && DVB_MT352
|
||||
---help---
|
||||
help
|
||||
This adds DVB-T support for cards based on the
|
||||
Conexant 2388x chip and the MT352 demodulator,
|
||||
which also require support for the VP-3054
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ config DVB_DDBRIDGE
|
|||
select DVB_MXL5XX if MEDIA_SUBDRV_AUTOSELECT
|
||||
select DVB_CXD2099 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select DVB_DUMMY_FE if MEDIA_SUBDRV_AUTOSELECT
|
||||
---help---
|
||||
help
|
||||
Support for cards with the Digital Devices PCI express bridge:
|
||||
- Octopus PCIe Bridge
|
||||
- Octopus mini PCIe Bridge
|
||||
|
|
@ -36,7 +36,7 @@ config DVB_DDBRIDGE_MSIENABLE
|
|||
depends on DVB_DDBRIDGE
|
||||
depends on PCI_MSI
|
||||
default n
|
||||
---help---
|
||||
help
|
||||
Use PCI MSI (Message Signaled Interrupts) per default. Enabling this
|
||||
might lead to I2C errors originating from the bridge in conjunction
|
||||
with certain SATA controllers, requiring a reload of the ddbridge
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ config VIDEO_DT3155
|
|||
depends on PCI && VIDEO_DEV && VIDEO_V4L2
|
||||
select VIDEOBUF2_DMA_CONTIG
|
||||
default n
|
||||
---help---
|
||||
help
|
||||
Enables dt3155 device driver for the DataTranslation DT3155 frame grabber.
|
||||
Say Y here if you have this hardware.
|
||||
In doubt, say N.
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ config VIDEO_IPU3_CIO2
|
|||
select V4L2_FWNODE
|
||||
select VIDEOBUF2_DMA_SG
|
||||
|
||||
---help---
|
||||
help
|
||||
This is the Intel IPU3 CIO2 CSI-2 receiver unit, found in Intel
|
||||
Skylake and Kaby Lake SoCs and used for capturing images and
|
||||
video from a camera sensor.
|
||||
|
|
|
|||
|
|
@ -1601,6 +1601,7 @@ static int cio2_queue_init(struct cio2_device *cio2, struct cio2_queue *q)
|
|||
subdev->owner = THIS_MODULE;
|
||||
snprintf(subdev->name, sizeof(subdev->name),
|
||||
CIO2_ENTITY_NAME " %td", q - cio2->queue);
|
||||
subdev->entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
|
||||
v4l2_set_subdevdata(subdev, cio2);
|
||||
r = v4l2_device_register_subdev(&cio2->v4l2_dev, subdev);
|
||||
if (r) {
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ config VIDEO_IVTV
|
|||
select VIDEO_VP27SMPX
|
||||
select VIDEO_UPD64031A
|
||||
select VIDEO_UPD64083
|
||||
---help---
|
||||
help
|
||||
This is a video4linux driver for Conexant cx23416 or cx23415 based
|
||||
PCI personal video recorder devices.
|
||||
|
||||
|
|
@ -32,7 +32,7 @@ config VIDEO_IVTV_DEPRECATED_IOCTLS
|
|||
bool "enable the DVB ioctls abuse on ivtv driver"
|
||||
depends on VIDEO_IVTV
|
||||
default n
|
||||
---help---
|
||||
help
|
||||
Enable the usage of the a DVB set of ioctls that were abused by
|
||||
IVTV driver for a while.
|
||||
|
||||
|
|
@ -45,7 +45,7 @@ config VIDEO_IVTV_ALSA
|
|||
tristate "Conexant cx23415/cx23416 ALSA interface for PCM audio capture"
|
||||
depends on VIDEO_IVTV && SND
|
||||
select SND_PCM
|
||||
---help---
|
||||
help
|
||||
This driver provides an ALSA interface as another method for user
|
||||
applications to obtain PCM audio data from Conexant cx23415/cx23416
|
||||
based PCI TV cards supported by the ivtv driver.
|
||||
|
|
@ -63,7 +63,7 @@ config VIDEO_FB_IVTV
|
|||
select FB_CFB_FILLRECT
|
||||
select FB_CFB_COPYAREA
|
||||
select FB_CFB_IMAGEBLIT
|
||||
---help---
|
||||
help
|
||||
This is a framebuffer driver for the Conexant cx23415 MPEG
|
||||
encoder/decoder.
|
||||
|
||||
|
|
@ -77,7 +77,7 @@ config VIDEO_FB_IVTV_FORCE_PAT
|
|||
bool "force cx23415 framebuffer init with x86 PAT enabled"
|
||||
depends on VIDEO_FB_IVTV && X86_PAT
|
||||
default n
|
||||
---help---
|
||||
help
|
||||
With PAT enabled, the cx23415 framebuffer driver does not
|
||||
utilize write-combined caching on the framebuffer memory.
|
||||
For this reason, the driver will by default disable itself
|
||||
|
|
|
|||
|
|
@ -420,7 +420,7 @@ static ssize_t ivtv_read_pos(struct ivtv_stream *s, char __user *ubuf, size_t co
|
|||
|
||||
IVTV_DEBUG_HI_FILE("read %zd from %s, got %zd\n", count, s->name, rc);
|
||||
if (rc > 0)
|
||||
pos += rc;
|
||||
*pos += rc;
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -225,7 +225,7 @@ int mantis_i2c_init(struct mantis_pci *mantis)
|
|||
|
||||
init_waitqueue_head(&mantis->i2c_wq);
|
||||
mutex_init(&mantis->i2c_lock);
|
||||
strncpy(i2c_adapter->name, "Mantis I2C", sizeof(i2c_adapter->name));
|
||||
strscpy(i2c_adapter->name, "Mantis I2C", sizeof(i2c_adapter->name));
|
||||
i2c_set_adapdata(i2c_adapter, mantis);
|
||||
|
||||
i2c_adapter->owner = THIS_MODULE;
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ config VIDEO_MEYE
|
|||
tristate "Sony Vaio Picturebook Motion Eye Video For Linux"
|
||||
depends on PCI && VIDEO_V4L2
|
||||
depends on SONY_LAPTOP || COMPILE_TEST
|
||||
---help---
|
||||
help
|
||||
This is the video4linux driver for the Motion Eye camera found
|
||||
in the Vaio Picturebook laptops. Please read the material in
|
||||
<file:Documentation/media/v4l-drivers/meye.rst> for more information.
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ config DVB_NETUP_UNIDVB
|
|||
select DVB_HELENE if MEDIA_SUBDRV_AUTOSELECT
|
||||
select DVB_LNBH25 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select DVB_CXD2841ER if MEDIA_SUBDRV_AUTOSELECT
|
||||
---help---
|
||||
help
|
||||
Support for NetUP PCI express Universal DVB card.
|
||||
|
||||
Say Y when you want to support NetUP Dual Universal DVB card.
|
||||
|
|
|
|||
|
|
@ -15,6 +15,6 @@ config DVB_NGENE
|
|||
select DVB_STV6111 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select DVB_LNBH25 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select DVB_CXD2099 if MEDIA_SUBDRV_AUTOSELECT
|
||||
---help---
|
||||
help
|
||||
Support for Micronas PCI express cards with nGene bridge.
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ config VIDEO_SAA7134
|
|||
select CRC32
|
||||
select VIDEO_SAA6588 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select VIDEO_SAA6752HS if MEDIA_SUBDRV_AUTOSELECT
|
||||
---help---
|
||||
help
|
||||
This is a video4linux driver for Philips SAA713x based
|
||||
TV cards.
|
||||
|
||||
|
|
@ -18,7 +18,7 @@ config VIDEO_SAA7134_ALSA
|
|||
tristate "Philips SAA7134 DMA audio support"
|
||||
depends on VIDEO_SAA7134 && SND
|
||||
select SND_PCM
|
||||
---help---
|
||||
help
|
||||
This is a video4linux driver for direct (DMA) audio in
|
||||
Philips SAA713x based TV cards using ALSA
|
||||
|
||||
|
|
@ -31,7 +31,7 @@ config VIDEO_SAA7134_RC
|
|||
depends on VIDEO_SAA7134
|
||||
depends on !(RC_CORE=m && VIDEO_SAA7134=y)
|
||||
default y
|
||||
---help---
|
||||
help
|
||||
Enables Remote Controller support on saa7134 driver.
|
||||
|
||||
config VIDEO_SAA7134_DVB
|
||||
|
|
@ -57,7 +57,7 @@ config VIDEO_SAA7134_DVB
|
|||
select MEDIA_TUNER_TDA18271 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select MEDIA_TUNER_TDA8290 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select DVB_ZL10039 if MEDIA_SUBDRV_AUTOSELECT
|
||||
---help---
|
||||
help
|
||||
This adds support for DVB cards based on the
|
||||
Philips saa7134 chip.
|
||||
|
||||
|
|
@ -68,6 +68,6 @@ config VIDEO_SAA7134_GO7007
|
|||
tristate "go7007 support for saa7134 based TV cards"
|
||||
depends on VIDEO_SAA7134
|
||||
depends on VIDEO_GO7007
|
||||
---help---
|
||||
help
|
||||
Enables saa7134 driver support for boards with go7007
|
||||
MPEG encoder (WIS Voyager or compatible).
|
||||
|
|
|
|||
|
|
@ -444,7 +444,7 @@ static int saa7134_go7007_init(struct saa7134_dev *dev)
|
|||
sd = &saa->sd;
|
||||
v4l2_subdev_init(sd, &saa7134_go7007_sd_ops);
|
||||
v4l2_set_subdevdata(sd, saa);
|
||||
strncpy(sd->name, "saa7134-go7007", sizeof(sd->name));
|
||||
strscpy(sd->name, "saa7134-go7007", sizeof(sd->name));
|
||||
|
||||
/* Allocate a couple pages for receiving the compressed stream */
|
||||
saa->top = (u8 *)get_zeroed_page(GFP_KERNEL);
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ config VIDEO_HEXIUM_GEMINI
|
|||
tristate "Hexium Gemini frame grabber"
|
||||
depends on PCI && VIDEO_V4L2 && I2C
|
||||
select VIDEO_SAA7146_VV
|
||||
---help---
|
||||
help
|
||||
This is a video4linux driver for the Hexium Gemini frame
|
||||
grabber card by Hexium. Please note that the Gemini Dual
|
||||
card is *not* fully supported.
|
||||
|
|
@ -14,7 +14,7 @@ config VIDEO_HEXIUM_ORION
|
|||
tristate "Hexium HV-PCI6 and Orion frame grabber"
|
||||
depends on PCI && VIDEO_V4L2 && I2C
|
||||
select VIDEO_SAA7146_VV
|
||||
---help---
|
||||
help
|
||||
This is a video4linux driver for the Hexium HV-PCI6 and
|
||||
Orion frame grabber cards by Hexium.
|
||||
|
||||
|
|
@ -30,7 +30,7 @@ config VIDEO_MXB
|
|||
select VIDEO_TDA9840 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select VIDEO_TEA6415C if MEDIA_SUBDRV_AUTOSELECT
|
||||
select VIDEO_TEA6420 if MEDIA_SUBDRV_AUTOSELECT
|
||||
---help---
|
||||
help
|
||||
This is a video4linux driver for the 'Multimedia eXtension Board'
|
||||
TV card by Siemens-Nixdorf.
|
||||
|
||||
|
|
|
|||
|
|
@ -270,9 +270,8 @@ static int hexium_attach(struct saa7146_dev *dev, struct saa7146_pci_extension_d
|
|||
/* enable i2c-port pins */
|
||||
saa7146_write(dev, MC1, (MASK_08 | MASK_24 | MASK_10 | MASK_26));
|
||||
|
||||
hexium->i2c_adapter = (struct i2c_adapter) {
|
||||
.name = "hexium gemini",
|
||||
};
|
||||
strscpy(hexium->i2c_adapter.name, "hexium gemini",
|
||||
sizeof(hexium->i2c_adapter.name));
|
||||
saa7146_i2c_adapter_prepare(dev, &hexium->i2c_adapter, SAA7146_I2C_BUS_BIT_RATE_480);
|
||||
if (i2c_add_adapter(&hexium->i2c_adapter) < 0) {
|
||||
DEB_S("cannot register i2c-device. skipping.\n");
|
||||
|
|
|
|||
|
|
@ -231,9 +231,8 @@ static int hexium_probe(struct saa7146_dev *dev)
|
|||
saa7146_write(dev, DD1_STREAM_B, 0x00000000);
|
||||
saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
|
||||
|
||||
hexium->i2c_adapter = (struct i2c_adapter) {
|
||||
.name = "hexium orion",
|
||||
};
|
||||
strscpy(hexium->i2c_adapter.name, "hexium orion",
|
||||
sizeof(hexium->i2c_adapter.name));
|
||||
saa7146_i2c_adapter_prepare(dev, &hexium->i2c_adapter, SAA7146_I2C_BUS_BIT_RATE_480);
|
||||
if (i2c_add_adapter(&hexium->i2c_adapter) < 0) {
|
||||
DEB_S("cannot register i2c-device. skipping.\n");
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ config VIDEO_SAA7164
|
|||
select DVB_TDA10048 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select DVB_S5H1411 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select MEDIA_TUNER_TDA18271 if MEDIA_SUBDRV_AUTOSELECT
|
||||
---help---
|
||||
help
|
||||
This is a video4linux driver for NXP SAA7164 based
|
||||
TV cards.
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ config VIDEO_SOLO6X10
|
|||
select VIDEOBUF2_DMA_CONTIG
|
||||
select SND_PCM
|
||||
select FONT_8x16
|
||||
---help---
|
||||
help
|
||||
This driver supports the Bluecherry H.264 and MPEG-4 hardware
|
||||
compression capture cards and other Softlogic-based ones.
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ config VIDEO_TW5864
|
|||
tristate "Techwell TW5864 video/audio grabber and encoder"
|
||||
depends on VIDEO_DEV && PCI && VIDEO_V4L2
|
||||
select VIDEOBUF2_DMA_CONTIG
|
||||
---help---
|
||||
help
|
||||
Support for boards based on Techwell TW5864 chip which provides
|
||||
multichannel video & audio grabbing and encoding (H.264, MJPEG,
|
||||
ADPCM G.726).
|
||||
|
|
|
|||
|
|
@ -1395,13 +1395,13 @@ static void tw5864_handle_frame(struct tw5864_h264_frame *frame)
|
|||
input->vb = NULL;
|
||||
spin_unlock_irqrestore(&input->slock, flags);
|
||||
|
||||
v4l2_buf = to_vb2_v4l2_buffer(&vb->vb.vb2_buf);
|
||||
|
||||
if (!vb) { /* Gone because of disabling */
|
||||
dev_dbg(&dev->pci->dev, "vb is empty, dropping frame\n");
|
||||
return;
|
||||
}
|
||||
|
||||
v4l2_buf = to_vb2_v4l2_buffer(&vb->vb.vb2_buf);
|
||||
|
||||
/*
|
||||
* Check for space.
|
||||
* Mind the overhead of startcode emulation prevention.
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ config VIDEO_TW68
|
|||
tristate "Techwell tw68x Video For Linux"
|
||||
depends on VIDEO_DEV && PCI && VIDEO_V4L2
|
||||
select VIDEOBUF2_DMA_SG
|
||||
---help---
|
||||
help
|
||||
Support for Techwell tw68xx based frame grabber boards.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ menuconfig V4L_PLATFORM_DRIVERS
|
|||
bool "V4L platform devices"
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
default n
|
||||
---help---
|
||||
help
|
||||
Say Y here to enable support for platform-specific V4L drivers.
|
||||
|
||||
if V4L_PLATFORM_DRIVERS
|
||||
|
|
@ -55,7 +55,7 @@ config VIDEO_VIU
|
|||
depends on VIDEO_V4L2 && (PPC_MPC512x || COMPILE_TEST) && I2C
|
||||
select VIDEOBUF_DMA_CONTIG
|
||||
default y
|
||||
---help---
|
||||
help
|
||||
Support for Freescale VIU video driver. This device captures
|
||||
video data, or overlays video on DIU frame buffer.
|
||||
|
||||
|
|
@ -80,13 +80,13 @@ config VIDEO_OMAP3
|
|||
select VIDEOBUF2_DMA_CONTIG
|
||||
select MFD_SYSCON
|
||||
select V4L2_FWNODE
|
||||
---help---
|
||||
help
|
||||
Driver for an OMAP 3 camera controller.
|
||||
|
||||
config VIDEO_OMAP3_DEBUG
|
||||
bool "OMAP 3 Camera debug messages"
|
||||
depends on VIDEO_OMAP3
|
||||
---help---
|
||||
help
|
||||
Enable debug messages on OMAP 3 camera controller driver.
|
||||
|
||||
config VIDEO_PXA27x
|
||||
|
|
@ -96,7 +96,7 @@ config VIDEO_PXA27x
|
|||
select VIDEOBUF2_DMA_SG
|
||||
select SG_SPLIT
|
||||
select V4L2_FWNODE
|
||||
---help---
|
||||
help
|
||||
This is a v4l2 driver for the PXA27x Quick Capture Interface
|
||||
|
||||
config VIDEO_QCOM_CAMSS
|
||||
|
|
@ -112,7 +112,7 @@ config VIDEO_S3C_CAMIF
|
|||
depends on PM
|
||||
depends on ARCH_S3C64XX || PLAT_S3C24XX || COMPILE_TEST
|
||||
select VIDEOBUF2_DMA_CONTIG
|
||||
---help---
|
||||
help
|
||||
This is a v4l2 driver for s3c24xx and s3c64xx SoC series camera
|
||||
host interface (CAMIF).
|
||||
|
||||
|
|
@ -125,7 +125,7 @@ config VIDEO_STM32_DCMI
|
|||
depends on ARCH_STM32 || COMPILE_TEST
|
||||
select VIDEOBUF2_DMA_CONTIG
|
||||
select V4L2_FWNODE
|
||||
---help---
|
||||
help
|
||||
This module makes the STM32 Digital Camera Memory Interface (DCMI)
|
||||
available as a v4l2 device.
|
||||
|
||||
|
|
@ -138,7 +138,7 @@ config VIDEO_RENESAS_CEU
|
|||
depends on ARCH_SHMOBILE || ARCH_R7S72100 || COMPILE_TEST
|
||||
select VIDEOBUF2_DMA_CONTIG
|
||||
select V4L2_FWNODE
|
||||
---help---
|
||||
help
|
||||
This is a v4l2 driver for the Renesas CEU Interface
|
||||
|
||||
source "drivers/media/platform/exynos4-is/Kconfig"
|
||||
|
|
@ -155,7 +155,7 @@ config VIDEO_TI_CAL
|
|||
select VIDEOBUF2_DMA_CONTIG
|
||||
select V4L2_FWNODE
|
||||
default n
|
||||
---help---
|
||||
help
|
||||
Support for the TI CAL (Camera Adaptation Layer) block
|
||||
found on DRA72X SoC.
|
||||
In TI Technical Reference Manual this module is referred as
|
||||
|
|
@ -168,7 +168,7 @@ menuconfig V4L_MEM2MEM_DRIVERS
|
|||
depends on VIDEO_V4L2
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
default n
|
||||
---help---
|
||||
help
|
||||
Say Y here to enable selecting drivers for V4L devices that
|
||||
use system memory for both source and destination buffers, as opposed
|
||||
to capture and output drivers, which use memory buffers for just
|
||||
|
|
@ -184,7 +184,7 @@ config VIDEO_CODA
|
|||
select VIDEOBUF2_VMALLOC
|
||||
select V4L2_MEM2MEM_DEV
|
||||
select GENERIC_ALLOCATOR
|
||||
---help---
|
||||
help
|
||||
Coda is a range of video codec IPs that supports
|
||||
H.264, MPEG-4, and other video formats.
|
||||
|
||||
|
|
@ -207,7 +207,7 @@ config VIDEO_MEDIATEK_JPEG
|
|||
depends on ARCH_MEDIATEK || COMPILE_TEST
|
||||
select VIDEOBUF2_DMA_CONTIG
|
||||
select V4L2_MEM2MEM_DEV
|
||||
---help---
|
||||
help
|
||||
Mediatek jpeg codec driver provides HW capability to decode
|
||||
JPEG format
|
||||
|
||||
|
|
@ -218,7 +218,7 @@ config VIDEO_MEDIATEK_VPU
|
|||
tristate "Mediatek Video Processor Unit"
|
||||
depends on VIDEO_DEV && VIDEO_V4L2
|
||||
depends on ARCH_MEDIATEK || COMPILE_TEST
|
||||
---help---
|
||||
help
|
||||
This driver provides downloading VPU firmware and
|
||||
communicating with VPU. This driver for hw video
|
||||
codec embedded in Mediatek's MT8173 SOCs. It is able
|
||||
|
|
@ -236,7 +236,7 @@ config VIDEO_MEDIATEK_MDP
|
|||
select V4L2_MEM2MEM_DEV
|
||||
select VIDEO_MEDIATEK_VPU
|
||||
default n
|
||||
---help---
|
||||
help
|
||||
It is a v4l2 driver and present in Mediatek MT8173 SoCs.
|
||||
The driver supports for scaling and color space conversion.
|
||||
|
||||
|
|
@ -252,7 +252,7 @@ config VIDEO_MEDIATEK_VCODEC
|
|||
select V4L2_MEM2MEM_DEV
|
||||
select VIDEO_MEDIATEK_VPU
|
||||
default n
|
||||
---help---
|
||||
help
|
||||
Mediatek video codec driver provides HW capability to
|
||||
encode and decode in a range of video formats
|
||||
This driver rely on VPU driver to communicate with VPU.
|
||||
|
|
@ -276,7 +276,7 @@ config VIDEO_SAMSUNG_S5P_G2D
|
|||
select VIDEOBUF2_DMA_CONTIG
|
||||
select V4L2_MEM2MEM_DEV
|
||||
default n
|
||||
---help---
|
||||
help
|
||||
This is a v4l2 driver for Samsung S5P and EXYNOS4 G2D
|
||||
2d graphics accelerator.
|
||||
|
||||
|
|
@ -286,7 +286,7 @@ config VIDEO_SAMSUNG_S5P_JPEG
|
|||
depends on ARCH_S5PV210 || ARCH_EXYNOS || COMPILE_TEST
|
||||
select VIDEOBUF2_DMA_CONTIG
|
||||
select V4L2_MEM2MEM_DEV
|
||||
---help---
|
||||
help
|
||||
This is a v4l2 driver for Samsung S5P, EXYNOS3250
|
||||
and EXYNOS4 JPEG codec
|
||||
|
||||
|
|
@ -407,7 +407,7 @@ config VIDEO_RENESAS_FDP1
|
|||
depends on (!ARM64 && !VIDEO_RENESAS_FCP) || VIDEO_RENESAS_FCP
|
||||
select VIDEOBUF2_DMA_CONTIG
|
||||
select V4L2_MEM2MEM_DEV
|
||||
---help---
|
||||
help
|
||||
This is a V4L2 driver for the Renesas Fine Display Processor
|
||||
providing colour space conversion, and de-interlacing features.
|
||||
|
||||
|
|
@ -420,7 +420,7 @@ config VIDEO_RENESAS_JPU
|
|||
depends on ARCH_RENESAS || COMPILE_TEST
|
||||
select VIDEOBUF2_DMA_CONTIG
|
||||
select V4L2_MEM2MEM_DEV
|
||||
---help---
|
||||
help
|
||||
This is a V4L2 driver for the Renesas JPEG Processing Unit.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
|
|
@ -430,7 +430,7 @@ config VIDEO_RENESAS_FCP
|
|||
tristate "Renesas Frame Compression Processor"
|
||||
depends on ARCH_RENESAS || COMPILE_TEST
|
||||
depends on OF
|
||||
---help---
|
||||
help
|
||||
This is a driver for the Renesas Frame Compression Processor (FCP).
|
||||
The FCP is a companion module of video processing modules in the
|
||||
Renesas R-Car Gen3 SoCs. It handles memory access for the codec,
|
||||
|
|
@ -446,7 +446,7 @@ config VIDEO_RENESAS_VSP1
|
|||
depends on (!ARM64 && !VIDEO_RENESAS_FCP) || VIDEO_RENESAS_FCP
|
||||
select VIDEOBUF2_DMA_CONTIG
|
||||
select VIDEOBUF2_VMALLOC
|
||||
---help---
|
||||
help
|
||||
This is a V4L2 driver for the Renesas VSP1 video processing engine.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
|
|
@ -459,7 +459,7 @@ config VIDEO_ROCKCHIP_RGA
|
|||
select VIDEOBUF2_DMA_SG
|
||||
select V4L2_MEM2MEM_DEV
|
||||
default n
|
||||
---help---
|
||||
help
|
||||
This is a v4l2 driver for Rockchip SOC RGA 2d graphics accelerator.
|
||||
Rockchip RGA is a separate 2D raster graphic acceleration unit.
|
||||
It accelerates 2D graphics operations, such as point/line drawing,
|
||||
|
|
@ -477,14 +477,14 @@ config VIDEO_TI_VPE
|
|||
select VIDEO_TI_SC
|
||||
select VIDEO_TI_CSC
|
||||
default n
|
||||
---help---
|
||||
help
|
||||
Support for the TI VPE(Video Processing Engine) block
|
||||
found on DRA7XX SoC.
|
||||
|
||||
config VIDEO_TI_VPE_DEBUG
|
||||
bool "VPE debug messages"
|
||||
depends on VIDEO_TI_VPE
|
||||
---help---
|
||||
help
|
||||
Enable debug messages on VPE driver.
|
||||
|
||||
config VIDEO_QCOM_VENUS
|
||||
|
|
@ -495,7 +495,7 @@ config VIDEO_QCOM_VENUS
|
|||
select QCOM_SCM if ARCH_QCOM
|
||||
select VIDEOBUF2_DMA_SG
|
||||
select V4L2_MEM2MEM_DEV
|
||||
---help---
|
||||
help
|
||||
This is a V4L2 driver for Qualcomm Venus video accelerator
|
||||
hardware. It accelerates encoding and decoding operations
|
||||
on various Qualcomm SoCs.
|
||||
|
|
@ -530,7 +530,7 @@ config VIDEO_VIM2M
|
|||
select VIDEOBUF2_VMALLOC
|
||||
select V4L2_MEM2MEM_DEV
|
||||
default n
|
||||
---help---
|
||||
help
|
||||
This is a virtual test device for the memory-to-memory driver
|
||||
framework.
|
||||
|
||||
|
|
@ -542,7 +542,7 @@ menuconfig DVB_PLATFORM_DRIVERS
|
|||
bool "DVB platform devices"
|
||||
depends on MEDIA_DIGITAL_TV_SUPPORT
|
||||
default n
|
||||
---help---
|
||||
help
|
||||
Say Y here to enable support for platform-specific Digital TV drivers.
|
||||
|
||||
if DVB_PLATFORM_DRIVERS
|
||||
|
|
@ -562,7 +562,7 @@ config VIDEO_CROS_EC_CEC
|
|||
select CEC_NOTIFIER
|
||||
select CHROME_PLATFORMS
|
||||
select CROS_EC_PROTO
|
||||
---help---
|
||||
help
|
||||
If you say yes here you will get support for the
|
||||
ChromeOS Embedded Controller's CEC.
|
||||
The CEC bus is present in the HDMI connector and enables communication
|
||||
|
|
@ -573,18 +573,34 @@ config VIDEO_MESON_AO_CEC
|
|||
depends on ARCH_MESON || COMPILE_TEST
|
||||
select CEC_CORE
|
||||
select CEC_NOTIFIER
|
||||
---help---
|
||||
help
|
||||
This is a driver for Amlogic Meson SoCs AO CEC interface. It uses the
|
||||
generic CEC framework interface.
|
||||
CEC bus is present in the HDMI connector and enables communication
|
||||
|
||||
config VIDEO_MESON_G12A_AO_CEC
|
||||
tristate "Amlogic Meson G12A AO CEC driver"
|
||||
depends on ARCH_MESON || COMPILE_TEST
|
||||
depends on COMMON_CLK && OF
|
||||
select REGMAP
|
||||
select REGMAP_MMIO
|
||||
select CEC_CORE
|
||||
select CEC_NOTIFIER
|
||||
---help---
|
||||
This is a driver for Amlogic Meson G12A SoCs AO CEC interface.
|
||||
This driver if for the new AO-CEC module found in G12A SoCs,
|
||||
usually named AO_CEC_B in documentation.
|
||||
It uses the generic CEC framework interface.
|
||||
CEC bus is present in the HDMI connector and enables communication
|
||||
between compatible devices.
|
||||
|
||||
config CEC_GPIO
|
||||
tristate "Generic GPIO-based CEC driver"
|
||||
depends on PREEMPT || COMPILE_TEST
|
||||
select CEC_CORE
|
||||
select CEC_PIN
|
||||
select GPIOLIB
|
||||
---help---
|
||||
help
|
||||
This is a generic GPIO-based CEC driver.
|
||||
The CEC bus is present in the HDMI connector and enables communication
|
||||
between compatible devices.
|
||||
|
|
@ -594,7 +610,7 @@ config VIDEO_SAMSUNG_S5P_CEC
|
|||
depends on ARCH_EXYNOS || COMPILE_TEST
|
||||
select CEC_CORE
|
||||
select CEC_NOTIFIER
|
||||
---help---
|
||||
help
|
||||
This is a driver for Samsung S5P HDMI CEC interface. It uses the
|
||||
generic CEC framework interface.
|
||||
CEC bus is present in the HDMI connector and enables communication
|
||||
|
|
@ -605,7 +621,7 @@ config VIDEO_STI_HDMI_CEC
|
|||
depends on ARCH_STI || COMPILE_TEST
|
||||
select CEC_CORE
|
||||
select CEC_NOTIFIER
|
||||
---help---
|
||||
help
|
||||
This is a driver for STIH4xx HDMI CEC interface. It uses the
|
||||
generic CEC framework interface.
|
||||
CEC bus is present in the HDMI connector and enables communication
|
||||
|
|
@ -617,7 +633,7 @@ config VIDEO_STM32_HDMI_CEC
|
|||
select REGMAP
|
||||
select REGMAP_MMIO
|
||||
select CEC_CORE
|
||||
---help---
|
||||
help
|
||||
This is a driver for STM32 interface. It uses the
|
||||
generic CEC framework interface.
|
||||
CEC bus is present in the HDMI connector and enables communication
|
||||
|
|
@ -628,7 +644,7 @@ config VIDEO_TEGRA_HDMI_CEC
|
|||
depends on ARCH_TEGRA || COMPILE_TEST
|
||||
select CEC_CORE
|
||||
select CEC_NOTIFIER
|
||||
---help---
|
||||
help
|
||||
This is a driver for the Tegra HDMI CEC interface. It uses the
|
||||
generic CEC framework interface.
|
||||
The CEC bus is present in the HDMI connector and enables communication
|
||||
|
|
@ -649,7 +665,7 @@ config VIDEO_SECO_CEC
|
|||
config VIDEO_SECO_RC
|
||||
bool "SECO Boards IR RC5 support"
|
||||
depends on VIDEO_SECO_CEC
|
||||
depends on RC_CORE
|
||||
depends on RC_CORE=y || RC_CORE = VIDEO_SECO_CEC
|
||||
help
|
||||
If you say yes here you will get support for the
|
||||
SECO Boards Consumer-IR in seco-cec driver.
|
||||
|
|
@ -662,7 +678,7 @@ menuconfig SDR_PLATFORM_DRIVERS
|
|||
bool "SDR platform devices"
|
||||
depends on MEDIA_SDR_SUPPORT
|
||||
default n
|
||||
---help---
|
||||
help
|
||||
Say Y here to enable support for platform-specific SDR Drivers.
|
||||
|
||||
if SDR_PLATFORM_DRIVERS
|
||||
|
|
@ -672,7 +688,7 @@ config VIDEO_RCAR_DRIF
|
|||
depends on VIDEO_V4L2
|
||||
depends on ARCH_RENESAS || COMPILE_TEST
|
||||
select VIDEOBUF2_VMALLOC
|
||||
---help---
|
||||
help
|
||||
Say Y if you want to enable R-Car Gen3 DRIF support. DRIF is Digital
|
||||
Radio Interface that interfaces with an RF front end chip. It is a
|
||||
receiver of digital data which uses DMA to transfer received data to
|
||||
|
|
|
|||
|
|
@ -1540,7 +1540,7 @@ static int vpfe_enum_fmt(struct file *file, void *priv,
|
|||
if (!fmt)
|
||||
return -EINVAL;
|
||||
|
||||
strncpy(f->description, fmt->name, sizeof(f->description) - 1);
|
||||
strscpy(f->description, fmt->name, sizeof(f->description));
|
||||
f->pixelformat = fmt->fourcc;
|
||||
f->type = vpfe->fmt.type;
|
||||
|
||||
|
|
|
|||
|
|
@ -14,7 +14,6 @@
|
|||
#include <linux/of_irq.h>
|
||||
#include <linux/of_reserved_mem.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/reset.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/string.h>
|
||||
|
|
@ -208,7 +207,6 @@ struct aspeed_video {
|
|||
void __iomem *base;
|
||||
struct clk *eclk;
|
||||
struct clk *vclk;
|
||||
struct reset_control *rst;
|
||||
|
||||
struct device *dev;
|
||||
struct v4l2_ctrl_handler ctrl_handler;
|
||||
|
|
@ -483,19 +481,10 @@ static void aspeed_video_enable_mode_detect(struct aspeed_video *video)
|
|||
aspeed_video_update(video, VE_SEQ_CTRL, 0, VE_SEQ_CTRL_TRIG_MODE_DET);
|
||||
}
|
||||
|
||||
static void aspeed_video_reset(struct aspeed_video *video)
|
||||
{
|
||||
/* Reset the engine */
|
||||
reset_control_assert(video->rst);
|
||||
|
||||
/* Don't usleep here; function may be called in interrupt context */
|
||||
udelay(100);
|
||||
reset_control_deassert(video->rst);
|
||||
}
|
||||
|
||||
static void aspeed_video_off(struct aspeed_video *video)
|
||||
{
|
||||
aspeed_video_reset(video);
|
||||
/* Disable interrupts */
|
||||
aspeed_video_write(video, VE_INTERRUPT_CTRL, 0);
|
||||
|
||||
/* Turn off the relevant clocks */
|
||||
clk_disable_unprepare(video->vclk);
|
||||
|
|
@ -507,8 +496,6 @@ static void aspeed_video_on(struct aspeed_video *video)
|
|||
/* Turn on the relevant clocks */
|
||||
clk_prepare_enable(video->eclk);
|
||||
clk_prepare_enable(video->vclk);
|
||||
|
||||
aspeed_video_reset(video);
|
||||
}
|
||||
|
||||
static void aspeed_video_bufs_done(struct aspeed_video *video,
|
||||
|
|
@ -1464,7 +1451,9 @@ static void aspeed_video_stop_streaming(struct vb2_queue *q)
|
|||
* Need to force stop any DMA and try and get HW into a good
|
||||
* state for future calls to start streaming again.
|
||||
*/
|
||||
aspeed_video_reset(video);
|
||||
aspeed_video_off(video);
|
||||
aspeed_video_on(video);
|
||||
|
||||
aspeed_video_init_regs(video);
|
||||
|
||||
aspeed_video_get_resolution(video);
|
||||
|
|
@ -1619,17 +1608,7 @@ static int aspeed_video_init(struct aspeed_video *video)
|
|||
return PTR_ERR(video->vclk);
|
||||
}
|
||||
|
||||
video->rst = devm_reset_control_get_exclusive(dev, NULL);
|
||||
if (IS_ERR(video->rst)) {
|
||||
dev_err(dev, "Unable to get VE reset\n");
|
||||
return PTR_ERR(video->rst);
|
||||
}
|
||||
|
||||
rc = of_reserved_mem_device_init(dev);
|
||||
if (rc) {
|
||||
dev_err(dev, "Unable to reserve memory\n");
|
||||
return rc;
|
||||
}
|
||||
of_reserved_mem_device_init(dev);
|
||||
|
||||
rc = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
|
||||
if (rc) {
|
||||
|
|
|
|||
|
|
@ -15,6 +15,6 @@ config VIDEO_ATMEL_ISI
|
|||
depends on ARCH_AT91 || COMPILE_TEST
|
||||
select VIDEOBUF2_DMA_CONTIG
|
||||
select V4L2_FWNODE
|
||||
---help---
|
||||
help
|
||||
This module makes the ATMEL Image Sensor Interface available
|
||||
as a v4l2 device.
|
||||
|
|
|
|||
|
|
@ -24,6 +24,8 @@
|
|||
#define ISC_PFE_CFG0_HPOL_LOW BIT(0)
|
||||
#define ISC_PFE_CFG0_VPOL_LOW BIT(1)
|
||||
#define ISC_PFE_CFG0_PPOL_LOW BIT(2)
|
||||
#define ISC_PFE_CFG0_CCIR656 BIT(9)
|
||||
#define ISC_PFE_CFG0_CCIR_CRC BIT(10)
|
||||
|
||||
#define ISC_PFE_CFG0_MODE_PROGRESSIVE (0x0 << 4)
|
||||
#define ISC_PFE_CFG0_MODE_MASK GENMASK(6, 4)
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -2010,6 +2010,9 @@ static int coda_prepare_decode(struct coda_ctx *ctx)
|
|||
/* Clear decode success flag */
|
||||
coda_write(dev, 0, CODA_RET_DEC_PIC_SUCCESS);
|
||||
|
||||
/* Clear error return value */
|
||||
coda_write(dev, 0, CODA_RET_DEC_PIC_ERR_MB);
|
||||
|
||||
trace_coda_dec_pic_run(ctx, meta);
|
||||
|
||||
coda_command_async(ctx, CODA_COMMAND_PIC_RUN);
|
||||
|
|
|
|||
|
|
@ -764,6 +764,7 @@ static int coda_s_fmt_vid_cap(struct file *file, void *priv,
|
|||
{
|
||||
struct coda_ctx *ctx = fh_to_ctx(priv);
|
||||
struct coda_q_data *q_data_src;
|
||||
const struct coda_codec *codec;
|
||||
struct v4l2_rect r;
|
||||
int ret;
|
||||
|
||||
|
|
@ -784,6 +785,15 @@ static int coda_s_fmt_vid_cap(struct file *file, void *priv,
|
|||
if (ctx->inst_type != CODA_INST_ENCODER)
|
||||
return 0;
|
||||
|
||||
/* Setting the coded format determines the selected codec */
|
||||
codec = coda_find_codec(ctx->dev, q_data_src->fourcc,
|
||||
f->fmt.pix.pixelformat);
|
||||
if (!codec) {
|
||||
v4l2_err(&ctx->dev->v4l2_dev, "failed to determine codec\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
ctx->codec = codec;
|
||||
|
||||
ctx->colorspace = f->fmt.pix.colorspace;
|
||||
ctx->xfer_func = f->fmt.pix.xfer_func;
|
||||
ctx->ycbcr_enc = f->fmt.pix.ycbcr_enc;
|
||||
|
|
@ -796,6 +806,7 @@ static int coda_s_fmt_vid_out(struct file *file, void *priv,
|
|||
struct v4l2_format *f)
|
||||
{
|
||||
struct coda_ctx *ctx = fh_to_ctx(priv);
|
||||
const struct coda_codec *codec;
|
||||
struct v4l2_format f_cap;
|
||||
struct vb2_queue *dst_vq;
|
||||
int ret;
|
||||
|
|
@ -808,14 +819,23 @@ static int coda_s_fmt_vid_out(struct file *file, void *priv,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (ctx->inst_type != CODA_INST_DECODER)
|
||||
return 0;
|
||||
|
||||
ctx->colorspace = f->fmt.pix.colorspace;
|
||||
ctx->xfer_func = f->fmt.pix.xfer_func;
|
||||
ctx->ycbcr_enc = f->fmt.pix.ycbcr_enc;
|
||||
ctx->quantization = f->fmt.pix.quantization;
|
||||
|
||||
if (ctx->inst_type != CODA_INST_DECODER)
|
||||
return 0;
|
||||
|
||||
/* Setting the coded format determines the selected codec */
|
||||
codec = coda_find_codec(ctx->dev, f->fmt.pix.pixelformat,
|
||||
V4L2_PIX_FMT_YUV420);
|
||||
if (!codec) {
|
||||
v4l2_err(&ctx->dev->v4l2_dev, "failed to determine codec\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
ctx->codec = codec;
|
||||
|
||||
dst_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
|
||||
if (!dst_vq)
|
||||
return -EINVAL;
|
||||
|
|
@ -980,6 +1000,11 @@ static int coda_s_selection(struct file *file, void *fh,
|
|||
static int coda_try_encoder_cmd(struct file *file, void *fh,
|
||||
struct v4l2_encoder_cmd *ec)
|
||||
{
|
||||
struct coda_ctx *ctx = fh_to_ctx(fh);
|
||||
|
||||
if (ctx->inst_type != CODA_INST_ENCODER)
|
||||
return -ENOTTY;
|
||||
|
||||
if (ec->cmd != V4L2_ENC_CMD_STOP)
|
||||
return -EINVAL;
|
||||
|
||||
|
|
@ -1000,10 +1025,6 @@ static int coda_encoder_cmd(struct file *file, void *fh,
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* Ignore encoder stop command silently in decoder context */
|
||||
if (ctx->inst_type != CODA_INST_ENCODER)
|
||||
return 0;
|
||||
|
||||
/* Set the stream-end flag on this context */
|
||||
ctx->bit_stream_param |= CODA_BIT_STREAM_END_FLAG;
|
||||
|
||||
|
|
@ -1021,6 +1042,11 @@ static int coda_encoder_cmd(struct file *file, void *fh,
|
|||
static int coda_try_decoder_cmd(struct file *file, void *fh,
|
||||
struct v4l2_decoder_cmd *dc)
|
||||
{
|
||||
struct coda_ctx *ctx = fh_to_ctx(fh);
|
||||
|
||||
if (ctx->inst_type != CODA_INST_DECODER)
|
||||
return -ENOTTY;
|
||||
|
||||
if (dc->cmd != V4L2_DEC_CMD_STOP)
|
||||
return -EINVAL;
|
||||
|
||||
|
|
@ -1043,10 +1069,6 @@ static int coda_decoder_cmd(struct file *file, void *fh,
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* Ignore decoder stop command silently in encoder context */
|
||||
if (ctx->inst_type != CODA_INST_DECODER)
|
||||
return 0;
|
||||
|
||||
/* Set the stream-end flag on this context */
|
||||
coda_bit_stream_end_flag(ctx);
|
||||
ctx->hold = false;
|
||||
|
|
@ -1055,6 +1077,42 @@ static int coda_decoder_cmd(struct file *file, void *fh,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int coda_enum_framesizes(struct file *file, void *fh,
|
||||
struct v4l2_frmsizeenum *fsize)
|
||||
{
|
||||
struct coda_ctx *ctx = fh_to_ctx(fh);
|
||||
struct coda_q_data *q_data_dst;
|
||||
const struct coda_codec *codec;
|
||||
|
||||
if (ctx->inst_type != CODA_INST_ENCODER)
|
||||
return -ENOTTY;
|
||||
|
||||
if (fsize->index)
|
||||
return -EINVAL;
|
||||
|
||||
if (coda_format_normalize_yuv(fsize->pixel_format) ==
|
||||
V4L2_PIX_FMT_YUV420) {
|
||||
q_data_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
|
||||
codec = coda_find_codec(ctx->dev, fsize->pixel_format,
|
||||
q_data_dst->fourcc);
|
||||
} else {
|
||||
codec = coda_find_codec(ctx->dev, V4L2_PIX_FMT_YUV420,
|
||||
fsize->pixel_format);
|
||||
}
|
||||
if (!codec)
|
||||
return -EINVAL;
|
||||
|
||||
fsize->type = V4L2_FRMSIZE_TYPE_CONTINUOUS;
|
||||
fsize->stepwise.min_width = MIN_W;
|
||||
fsize->stepwise.max_width = codec->max_w;
|
||||
fsize->stepwise.step_width = 1;
|
||||
fsize->stepwise.min_height = MIN_H;
|
||||
fsize->stepwise.max_height = codec->max_h;
|
||||
fsize->stepwise.step_height = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int coda_enum_frameintervals(struct file *file, void *fh,
|
||||
struct v4l2_frmivalenum *f)
|
||||
{
|
||||
|
|
@ -1233,6 +1291,7 @@ static const struct v4l2_ioctl_ops coda_ioctl_ops = {
|
|||
.vidioc_g_parm = coda_g_parm,
|
||||
.vidioc_s_parm = coda_s_parm,
|
||||
|
||||
.vidioc_enum_framesizes = coda_enum_framesizes,
|
||||
.vidioc_enum_frameintervals = coda_enum_frameintervals,
|
||||
|
||||
.vidioc_subscribe_event = coda_subscribe_event,
|
||||
|
|
@ -1442,6 +1501,9 @@ static int coda_queue_setup(struct vb2_queue *vq,
|
|||
q_data = get_q_data(ctx, vq->type);
|
||||
size = q_data->sizeimage;
|
||||
|
||||
if (*nplanes)
|
||||
return sizes[0] < size ? -EINVAL : 0;
|
||||
|
||||
*nplanes = 1;
|
||||
sizes[0] = size;
|
||||
|
||||
|
|
@ -1680,14 +1742,6 @@ static int coda_start_streaming(struct vb2_queue *q, unsigned int count)
|
|||
|
||||
ctx->gopcounter = ctx->params.gop_size - 1;
|
||||
|
||||
ctx->codec = coda_find_codec(ctx->dev, q_data_src->fourcc,
|
||||
q_data_dst->fourcc);
|
||||
if (!ctx->codec) {
|
||||
v4l2_err(v4l2_dev, "couldn't tell instance type.\n");
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (q_data_dst->fourcc == V4L2_PIX_FMT_JPEG)
|
||||
ctx->params.gop_size = 1;
|
||||
ctx->gopcounter = ctx->params.gop_size - 1;
|
||||
|
|
@ -2015,7 +2069,6 @@ static void coda_jpeg_encode_ctrls(struct coda_ctx *ctx)
|
|||
|
||||
static void coda_decode_ctrls(struct coda_ctx *ctx)
|
||||
{
|
||||
u64 mask;
|
||||
u8 max;
|
||||
|
||||
ctx->h264_profile_ctrl = v4l2_ctrl_new_std_menu(&ctx->ctrls,
|
||||
|
|
@ -2029,27 +2082,14 @@ static void coda_decode_ctrls(struct coda_ctx *ctx)
|
|||
ctx->h264_profile_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
|
||||
|
||||
if (ctx->dev->devtype->product == CODA_HX4 ||
|
||||
ctx->dev->devtype->product == CODA_7541) {
|
||||
ctx->dev->devtype->product == CODA_7541)
|
||||
max = V4L2_MPEG_VIDEO_H264_LEVEL_4_0;
|
||||
mask = ~((1 << V4L2_MPEG_VIDEO_H264_LEVEL_2_0) |
|
||||
(1 << V4L2_MPEG_VIDEO_H264_LEVEL_3_0) |
|
||||
(1 << V4L2_MPEG_VIDEO_H264_LEVEL_3_1) |
|
||||
(1 << V4L2_MPEG_VIDEO_H264_LEVEL_3_2) |
|
||||
(1 << V4L2_MPEG_VIDEO_H264_LEVEL_4_0));
|
||||
} else if (ctx->dev->devtype->product == CODA_960) {
|
||||
else if (ctx->dev->devtype->product == CODA_960)
|
||||
max = V4L2_MPEG_VIDEO_H264_LEVEL_4_1;
|
||||
mask = ~((1 << V4L2_MPEG_VIDEO_H264_LEVEL_2_0) |
|
||||
(1 << V4L2_MPEG_VIDEO_H264_LEVEL_3_0) |
|
||||
(1 << V4L2_MPEG_VIDEO_H264_LEVEL_3_1) |
|
||||
(1 << V4L2_MPEG_VIDEO_H264_LEVEL_3_2) |
|
||||
(1 << V4L2_MPEG_VIDEO_H264_LEVEL_4_0) |
|
||||
(1 << V4L2_MPEG_VIDEO_H264_LEVEL_4_1));
|
||||
} else {
|
||||
else
|
||||
return;
|
||||
}
|
||||
ctx->h264_level_ctrl = v4l2_ctrl_new_std_menu(&ctx->ctrls,
|
||||
&coda_ctrl_ops, V4L2_CID_MPEG_VIDEO_H264_LEVEL, max, mask,
|
||||
max);
|
||||
&coda_ctrl_ops, V4L2_CID_MPEG_VIDEO_H264_LEVEL, max, 0, max);
|
||||
if (ctx->h264_level_ctrl)
|
||||
ctx->h264_level_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
|
||||
}
|
||||
|
|
@ -2063,11 +2103,17 @@ static int coda_ctrls_setup(struct coda_ctx *ctx)
|
|||
v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
|
||||
V4L2_CID_VFLIP, 0, 1, 1, 0);
|
||||
if (ctx->inst_type == CODA_INST_ENCODER) {
|
||||
v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
|
||||
V4L2_CID_MIN_BUFFERS_FOR_OUTPUT,
|
||||
1, 1, 1, 1);
|
||||
if (ctx->cvd->dst_formats[0] == V4L2_PIX_FMT_JPEG)
|
||||
coda_jpeg_encode_ctrls(ctx);
|
||||
else
|
||||
coda_encode_ctrls(ctx);
|
||||
} else {
|
||||
v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
|
||||
V4L2_CID_MIN_BUFFERS_FOR_CAPTURE,
|
||||
1, 1, 1, 1);
|
||||
if (ctx->cvd->src_formats[0] == V4L2_PIX_FMT_H264)
|
||||
coda_decode_ctrls(ctx);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -236,6 +236,7 @@ static int cros_ec_cec_get_notifier(struct device *dev,
|
|||
return -EPROBE_DEFER;
|
||||
|
||||
*notify = cec_notifier_get_conn(d, m->conn);
|
||||
put_device(d);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -884,9 +884,7 @@ static int isif_set_hw_if_params(struct vpfe_hw_if_param *params)
|
|||
static int isif_config_ycbcr(void)
|
||||
{
|
||||
struct isif_ycbcr_config *params = &isif_cfg.ycbcr;
|
||||
struct vpss_pg_frame_size frame_size;
|
||||
u32 modeset = 0, ccdcfg = 0;
|
||||
struct vpss_sync_pol sync;
|
||||
|
||||
dev_dbg(isif_cfg.dev, "\nStarting isif_config_ycbcr...");
|
||||
|
||||
|
|
@ -974,13 +972,6 @@ static int isif_config_ycbcr(void)
|
|||
/* two fields are interleaved in memory */
|
||||
regw(0x00000249, SDOFST);
|
||||
|
||||
/* Setup test pattern if enabled */
|
||||
if (isif_cfg.bayer.config_params.test_pat_gen) {
|
||||
sync.ccdpg_hdpol = params->hd_pol;
|
||||
sync.ccdpg_vdpol = params->vd_pol;
|
||||
dm365_vpss_set_sync_pol(sync);
|
||||
dm365_vpss_set_pg_frame_size(frame_size);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1759,7 +1759,7 @@ static int vpfe_probe(struct platform_device *pdev)
|
|||
|
||||
mutex_lock(&ccdc_lock);
|
||||
|
||||
strncpy(ccdc_cfg->name, vpfe_cfg->ccdc, 32);
|
||||
strscpy(ccdc_cfg->name, vpfe_cfg->ccdc, sizeof(ccdc_cfg->name));
|
||||
/* Get VINT0 irq resource */
|
||||
res1 = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
|
||||
if (!res1) {
|
||||
|
|
|
|||
|
|
@ -1254,7 +1254,8 @@ static int vpif_s_dv_timings(struct file *file, void *priv,
|
|||
} else {
|
||||
std_info->l5 = std_info->vsize - (bt->vfrontporch - 1);
|
||||
}
|
||||
strncpy(std_info->name, "Custom timings BT656/1120", VPIF_MAX_NAME);
|
||||
strscpy(std_info->name, "Custom timings BT656/1120",
|
||||
sizeof(std_info->name));
|
||||
std_info->width = bt->width;
|
||||
std_info->height = bt->height;
|
||||
std_info->frm_fmt = bt->interlaced ? 0 : 1;
|
||||
|
|
|
|||
|
|
@ -987,8 +987,8 @@ static int vpif_s_dv_timings(struct file *file, void *priv,
|
|||
} else {
|
||||
std_info->l5 = std_info->vsize - (bt->vfrontporch - 1);
|
||||
}
|
||||
strncpy(std_info->name, "Custom timings BT656/1120",
|
||||
VPIF_MAX_NAME);
|
||||
strscpy(std_info->name, "Custom timings BT656/1120",
|
||||
sizeof(std_info->name));
|
||||
std_info->width = bt->width;
|
||||
std_info->height = bt->height;
|
||||
std_info->frm_fmt = bt->interlaced ? 0 : 1;
|
||||
|
|
|
|||
|
|
@ -742,7 +742,7 @@ static int fimc_cap_enum_fmt_mplane(struct file *file, void *priv,
|
|||
f->index);
|
||||
if (!fmt)
|
||||
return -EINVAL;
|
||||
strncpy(f->description, fmt->name, sizeof(f->description) - 1);
|
||||
strscpy(f->description, fmt->name, sizeof(f->description));
|
||||
f->pixelformat = fmt->fourcc;
|
||||
if (fmt->fourcc == MEDIA_BUS_FMT_JPEG_1X8)
|
||||
f->flags |= V4L2_FMT_FLAG_COMPRESSED;
|
||||
|
|
|
|||
|
|
@ -252,7 +252,7 @@ static int fimc_m2m_enum_fmt_mplane(struct file *file, void *priv,
|
|||
if (!fmt)
|
||||
return -EINVAL;
|
||||
|
||||
strncpy(f->description, fmt->name, sizeof(f->description) - 1);
|
||||
strscpy(f->description, fmt->name, sizeof(f->description));
|
||||
f->pixelformat = fmt->fourcc;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1025,8 +1025,8 @@ static irqreturn_t pxp_irq_handler(int irq, void *dev_id)
|
|||
static int pxp_querycap(struct file *file, void *priv,
|
||||
struct v4l2_capability *cap)
|
||||
{
|
||||
strlcpy(cap->driver, MEM2MEM_NAME, sizeof(cap->driver));
|
||||
strlcpy(cap->card, MEM2MEM_NAME, sizeof(cap->card));
|
||||
strscpy(cap->driver, MEM2MEM_NAME, sizeof(cap->driver));
|
||||
strscpy(cap->card, MEM2MEM_NAME, sizeof(cap->card));
|
||||
snprintf(cap->bus_info, sizeof(cap->bus_info),
|
||||
"platform:%s", MEM2MEM_NAME);
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ config VIDEO_CAFE_CCIC
|
|||
select VIDEOBUF2_VMALLOC
|
||||
select VIDEOBUF2_DMA_CONTIG
|
||||
select VIDEOBUF2_DMA_SG
|
||||
---help---
|
||||
help
|
||||
This is a video4linux2 driver for the Marvell 88ALP01 integrated
|
||||
CMOS camera controller. This is the controller found on first-
|
||||
generation OLPC systems.
|
||||
|
|
@ -19,7 +19,7 @@ config VIDEO_MMP_CAMERA
|
|||
select VIDEOBUF2_VMALLOC
|
||||
select VIDEOBUF2_DMA_CONTIG
|
||||
select VIDEOBUF2_DMA_SG
|
||||
---help---
|
||||
help
|
||||
This is a Video4Linux2 driver for the integrated camera
|
||||
controller found on Marvell Armada 610 application
|
||||
processors (and likely beyond). This is the controller found
|
||||
|
|
|
|||
|
|
@ -1 +1,2 @@
|
|||
obj-$(CONFIG_VIDEO_MESON_AO_CEC) += ao-cec.o
|
||||
obj-$(CONFIG_VIDEO_MESON_G12A_AO_CEC) += ao-cec-g12a.o
|
||||
|
|
|
|||
779
drivers/media/platform/meson/ao-cec-g12a.c
Normal file
779
drivers/media/platform/meson/ao-cec-g12a.c
Normal file
|
|
@ -0,0 +1,779 @@
|
|||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Driver for Amlogic Meson AO CEC G12A Controller
|
||||
*
|
||||
* Copyright (C) 2017 Amlogic, Inc. All rights reserved
|
||||
* Copyright (C) 2019 BayLibre, SAS
|
||||
* Author: Neil Armstrong <narmstrong@baylibre.com>
|
||||
*/
|
||||
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/reset.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <media/cec.h>
|
||||
#include <media/cec-notifier.h>
|
||||
#include <linux/clk-provider.h>
|
||||
|
||||
/* CEC Registers */
|
||||
|
||||
#define CECB_CLK_CNTL_REG0 0x00
|
||||
|
||||
#define CECB_CLK_CNTL_N1 GENMASK(11, 0)
|
||||
#define CECB_CLK_CNTL_N2 GENMASK(23, 12)
|
||||
#define CECB_CLK_CNTL_DUAL_EN BIT(28)
|
||||
#define CECB_CLK_CNTL_OUTPUT_EN BIT(30)
|
||||
#define CECB_CLK_CNTL_INPUT_EN BIT(31)
|
||||
|
||||
#define CECB_CLK_CNTL_REG1 0x04
|
||||
|
||||
#define CECB_CLK_CNTL_M1 GENMASK(11, 0)
|
||||
#define CECB_CLK_CNTL_M2 GENMASK(23, 12)
|
||||
#define CECB_CLK_CNTL_BYPASS_EN BIT(24)
|
||||
|
||||
/*
|
||||
* [14:12] Filter_del. For glitch-filtering CEC line, ignore signal
|
||||
* change pulse width < filter_del * T(filter_tick) * 3.
|
||||
* [9:8] Filter_tick_sel: Select which periodical pulse for
|
||||
* glitch-filtering CEC line signal.
|
||||
* - 0=Use T(xtal)*3 = 125ns;
|
||||
* - 1=Use once-per-1us pulse;
|
||||
* - 2=Use once-per-10us pulse;
|
||||
* - 3=Use once-per-100us pulse.
|
||||
* [3] Sysclk_en. 0=Disable system clock; 1=Enable system clock.
|
||||
* [2:1] cntl_clk
|
||||
* - 0 = Disable clk (Power-off mode)
|
||||
* - 1 = Enable gated clock (Normal mode)
|
||||
* - 2 = Enable free-run clk (Debug mode)
|
||||
* [0] SW_RESET 1=Apply reset; 0=No reset.
|
||||
*/
|
||||
#define CECB_GEN_CNTL_REG 0x08
|
||||
|
||||
#define CECB_GEN_CNTL_RESET BIT(0)
|
||||
#define CECB_GEN_CNTL_CLK_DISABLE 0
|
||||
#define CECB_GEN_CNTL_CLK_ENABLE 1
|
||||
#define CECB_GEN_CNTL_CLK_ENABLE_DBG 2
|
||||
#define CECB_GEN_CNTL_CLK_CTRL_MASK GENMASK(2, 1)
|
||||
#define CECB_GEN_CNTL_SYS_CLK_EN BIT(3)
|
||||
#define CECB_GEN_CNTL_FILTER_TICK_125NS 0
|
||||
#define CECB_GEN_CNTL_FILTER_TICK_1US 1
|
||||
#define CECB_GEN_CNTL_FILTER_TICK_10US 2
|
||||
#define CECB_GEN_CNTL_FILTER_TICK_100US 3
|
||||
#define CECB_GEN_CNTL_FILTER_TICK_SEL GENMASK(9, 8)
|
||||
#define CECB_GEN_CNTL_FILTER_DEL GENMASK(14, 12)
|
||||
|
||||
/*
|
||||
* [7:0] cec_reg_addr
|
||||
* [15:8] cec_reg_wrdata
|
||||
* [16] cec_reg_wr
|
||||
* - 0 = Read
|
||||
* - 1 = Write
|
||||
* [31:24] cec_reg_rddata
|
||||
*/
|
||||
#define CECB_RW_REG 0x0c
|
||||
|
||||
#define CECB_RW_ADDR GENMASK(7, 0)
|
||||
#define CECB_RW_WR_DATA GENMASK(15, 8)
|
||||
#define CECB_RW_WRITE_EN BIT(16)
|
||||
#define CECB_RW_BUS_BUSY BIT(23)
|
||||
#define CECB_RW_RD_DATA GENMASK(31, 24)
|
||||
|
||||
/*
|
||||
* [0] DONE Interrupt
|
||||
* [1] End Of Message Interrupt
|
||||
* [2] Not Acknowlegde Interrupt
|
||||
* [3] Arbitration Loss Interrupt
|
||||
* [4] Initiator Error Interrupt
|
||||
* [5] Follower Error Interrupt
|
||||
* [6] Wake-Up Interrupt
|
||||
*/
|
||||
#define CECB_INTR_MASKN_REG 0x10
|
||||
#define CECB_INTR_CLR_REG 0x14
|
||||
#define CECB_INTR_STAT_REG 0x18
|
||||
|
||||
#define CECB_INTR_DONE BIT(0)
|
||||
#define CECB_INTR_EOM BIT(1)
|
||||
#define CECB_INTR_NACK BIT(2)
|
||||
#define CECB_INTR_ARB_LOSS BIT(3)
|
||||
#define CECB_INTR_INITIATOR_ERR BIT(4)
|
||||
#define CECB_INTR_FOLLOWER_ERR BIT(5)
|
||||
#define CECB_INTR_WAKE_UP BIT(6)
|
||||
|
||||
/* CEC Commands */
|
||||
|
||||
#define CECB_CTRL 0x00
|
||||
|
||||
#define CECB_CTRL_SEND BIT(0)
|
||||
#define CECB_CTRL_TYPE GENMASK(2, 1)
|
||||
#define CECB_CTRL_TYPE_RETRY 0
|
||||
#define CECB_CTRL_TYPE_NEW 1
|
||||
#define CECB_CTRL_TYPE_NEXT 2
|
||||
|
||||
#define CECB_CTRL2 0x01
|
||||
#define CECB_INTR_MASK 0x02
|
||||
#define CECB_LADD_LOW 0x05
|
||||
#define CECB_LADD_HIGH 0x06
|
||||
#define CECB_TX_CNT 0x07
|
||||
#define CECB_RX_CNT 0x08
|
||||
#define CECB_STAT0 0x09
|
||||
#define CECB_TX_DATA00 0x10
|
||||
#define CECB_TX_DATA01 0x11
|
||||
#define CECB_TX_DATA02 0x12
|
||||
#define CECB_TX_DATA03 0x13
|
||||
#define CECB_TX_DATA04 0x14
|
||||
#define CECB_TX_DATA05 0x15
|
||||
#define CECB_TX_DATA06 0x16
|
||||
#define CECB_TX_DATA07 0x17
|
||||
#define CECB_TX_DATA08 0x18
|
||||
#define CECB_TX_DATA09 0x19
|
||||
#define CECB_TX_DATA10 0x1A
|
||||
#define CECB_TX_DATA11 0x1B
|
||||
#define CECB_TX_DATA12 0x1C
|
||||
#define CECB_TX_DATA13 0x1D
|
||||
#define CECB_TX_DATA14 0x1E
|
||||
#define CECB_TX_DATA15 0x1F
|
||||
#define CECB_RX_DATA00 0x20
|
||||
#define CECB_RX_DATA01 0x21
|
||||
#define CECB_RX_DATA02 0x22
|
||||
#define CECB_RX_DATA03 0x23
|
||||
#define CECB_RX_DATA04 0x24
|
||||
#define CECB_RX_DATA05 0x25
|
||||
#define CECB_RX_DATA06 0x26
|
||||
#define CECB_RX_DATA07 0x27
|
||||
#define CECB_RX_DATA08 0x28
|
||||
#define CECB_RX_DATA09 0x29
|
||||
#define CECB_RX_DATA10 0x2A
|
||||
#define CECB_RX_DATA11 0x2B
|
||||
#define CECB_RX_DATA12 0x2C
|
||||
#define CECB_RX_DATA13 0x2D
|
||||
#define CECB_RX_DATA14 0x2E
|
||||
#define CECB_RX_DATA15 0x2F
|
||||
#define CECB_LOCK_BUF 0x30
|
||||
|
||||
#define CECB_LOCK_BUF_EN BIT(0)
|
||||
|
||||
#define CECB_WAKEUPCTRL 0x31
|
||||
|
||||
struct meson_ao_cec_g12a_device {
|
||||
struct platform_device *pdev;
|
||||
struct regmap *regmap;
|
||||
struct regmap *regmap_cec;
|
||||
spinlock_t cec_reg_lock;
|
||||
struct cec_notifier *notify;
|
||||
struct cec_adapter *adap;
|
||||
struct cec_msg rx_msg;
|
||||
struct clk *oscin;
|
||||
struct clk *core;
|
||||
};
|
||||
|
||||
static const struct regmap_config meson_ao_cec_g12a_regmap_conf = {
|
||||
.reg_bits = 8,
|
||||
.val_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.max_register = CECB_INTR_STAT_REG,
|
||||
};
|
||||
|
||||
/*
|
||||
* The AO-CECB embeds a dual/divider to generate a more precise
|
||||
* 32,768KHz clock for CEC core clock.
|
||||
* ______ ______
|
||||
* | | | |
|
||||
* ______ | Div1 |-| Cnt1 | ______
|
||||
* | | /|______| |______|\ | |
|
||||
* Xtal-->| Gate |---| ______ ______ X-X--| Gate |-->
|
||||
* |______| | \| | | |/ | |______|
|
||||
* | | Div2 |-| Cnt2 | |
|
||||
* | |______| |______| |
|
||||
* |_______________________|
|
||||
*
|
||||
* The dividing can be switched to single or dual, with a counter
|
||||
* for each divider to set when the switching is done.
|
||||
* The entire dividing mechanism can be also bypassed.
|
||||
*/
|
||||
|
||||
struct meson_ao_cec_g12a_dualdiv_clk {
|
||||
struct clk_hw hw;
|
||||
struct regmap *regmap;
|
||||
};
|
||||
|
||||
#define hw_to_meson_ao_cec_g12a_dualdiv_clk(_hw) \
|
||||
container_of(_hw, struct meson_ao_cec_g12a_dualdiv_clk, hw) \
|
||||
|
||||
static unsigned long
|
||||
meson_ao_cec_g12a_dualdiv_clk_recalc_rate(struct clk_hw *hw,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct meson_ao_cec_g12a_dualdiv_clk *dualdiv_clk =
|
||||
hw_to_meson_ao_cec_g12a_dualdiv_clk(hw);
|
||||
unsigned long n1;
|
||||
u32 reg0, reg1;
|
||||
|
||||
regmap_read(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0, ®0);
|
||||
regmap_read(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0, ®1);
|
||||
|
||||
if (reg1 & CECB_CLK_CNTL_BYPASS_EN)
|
||||
return parent_rate;
|
||||
|
||||
if (reg0 & CECB_CLK_CNTL_DUAL_EN) {
|
||||
unsigned long n2, m1, m2, f1, f2, p1, p2;
|
||||
|
||||
n1 = FIELD_GET(CECB_CLK_CNTL_N1, reg0) + 1;
|
||||
n2 = FIELD_GET(CECB_CLK_CNTL_N2, reg0) + 1;
|
||||
|
||||
m1 = FIELD_GET(CECB_CLK_CNTL_M1, reg1) + 1;
|
||||
m2 = FIELD_GET(CECB_CLK_CNTL_M1, reg1) + 1;
|
||||
|
||||
f1 = DIV_ROUND_CLOSEST(parent_rate, n1);
|
||||
f2 = DIV_ROUND_CLOSEST(parent_rate, n2);
|
||||
|
||||
p1 = DIV_ROUND_CLOSEST(100000000 * m1, f1 * (m1 + m2));
|
||||
p2 = DIV_ROUND_CLOSEST(100000000 * m2, f2 * (m1 + m2));
|
||||
|
||||
return DIV_ROUND_UP(100000000, p1 + p2);
|
||||
}
|
||||
|
||||
n1 = FIELD_GET(CECB_CLK_CNTL_N1, reg0) + 1;
|
||||
|
||||
return DIV_ROUND_CLOSEST(parent_rate, n1);
|
||||
}
|
||||
|
||||
static int meson_ao_cec_g12a_dualdiv_clk_enable(struct clk_hw *hw)
|
||||
{
|
||||
struct meson_ao_cec_g12a_dualdiv_clk *dualdiv_clk =
|
||||
hw_to_meson_ao_cec_g12a_dualdiv_clk(hw);
|
||||
|
||||
|
||||
/* Disable Input & Output */
|
||||
regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0,
|
||||
CECB_CLK_CNTL_INPUT_EN | CECB_CLK_CNTL_OUTPUT_EN,
|
||||
0);
|
||||
|
||||
/* Set N1 & N2 */
|
||||
regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0,
|
||||
CECB_CLK_CNTL_N1,
|
||||
FIELD_PREP(CECB_CLK_CNTL_N1, 733 - 1));
|
||||
|
||||
regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0,
|
||||
CECB_CLK_CNTL_N2,
|
||||
FIELD_PREP(CECB_CLK_CNTL_N2, 732 - 1));
|
||||
|
||||
/* Set M1 & M2 */
|
||||
regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG1,
|
||||
CECB_CLK_CNTL_M1,
|
||||
FIELD_PREP(CECB_CLK_CNTL_M1, 8 - 1));
|
||||
|
||||
regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG1,
|
||||
CECB_CLK_CNTL_M2,
|
||||
FIELD_PREP(CECB_CLK_CNTL_M2, 11 - 1));
|
||||
|
||||
/* Enable Dual divisor */
|
||||
regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0,
|
||||
CECB_CLK_CNTL_DUAL_EN, CECB_CLK_CNTL_DUAL_EN);
|
||||
|
||||
/* Disable divisor bypass */
|
||||
regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG1,
|
||||
CECB_CLK_CNTL_BYPASS_EN, 0);
|
||||
|
||||
/* Enable Input & Output */
|
||||
regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0,
|
||||
CECB_CLK_CNTL_INPUT_EN | CECB_CLK_CNTL_OUTPUT_EN,
|
||||
CECB_CLK_CNTL_INPUT_EN | CECB_CLK_CNTL_OUTPUT_EN);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void meson_ao_cec_g12a_dualdiv_clk_disable(struct clk_hw *hw)
|
||||
{
|
||||
struct meson_ao_cec_g12a_dualdiv_clk *dualdiv_clk =
|
||||
hw_to_meson_ao_cec_g12a_dualdiv_clk(hw);
|
||||
|
||||
regmap_update_bits(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0,
|
||||
CECB_CLK_CNTL_INPUT_EN | CECB_CLK_CNTL_OUTPUT_EN,
|
||||
0);
|
||||
}
|
||||
|
||||
static int meson_ao_cec_g12a_dualdiv_clk_is_enabled(struct clk_hw *hw)
|
||||
{
|
||||
struct meson_ao_cec_g12a_dualdiv_clk *dualdiv_clk =
|
||||
hw_to_meson_ao_cec_g12a_dualdiv_clk(hw);
|
||||
int val;
|
||||
|
||||
regmap_read(dualdiv_clk->regmap, CECB_CLK_CNTL_REG0, &val);
|
||||
|
||||
return !!(val & (CECB_CLK_CNTL_INPUT_EN | CECB_CLK_CNTL_OUTPUT_EN));
|
||||
}
|
||||
|
||||
static const struct clk_ops meson_ao_cec_g12a_dualdiv_clk_ops = {
|
||||
.recalc_rate = meson_ao_cec_g12a_dualdiv_clk_recalc_rate,
|
||||
.is_enabled = meson_ao_cec_g12a_dualdiv_clk_is_enabled,
|
||||
.enable = meson_ao_cec_g12a_dualdiv_clk_enable,
|
||||
.disable = meson_ao_cec_g12a_dualdiv_clk_disable,
|
||||
};
|
||||
|
||||
static int meson_ao_cec_g12a_setup_clk(struct meson_ao_cec_g12a_device *ao_cec)
|
||||
{
|
||||
struct meson_ao_cec_g12a_dualdiv_clk *dualdiv_clk;
|
||||
struct device *dev = &ao_cec->pdev->dev;
|
||||
struct clk_init_data init;
|
||||
const char *parent_name;
|
||||
struct clk *clk;
|
||||
char *name;
|
||||
|
||||
dualdiv_clk = devm_kzalloc(dev, sizeof(*dualdiv_clk), GFP_KERNEL);
|
||||
if (!dualdiv_clk)
|
||||
return -ENOMEM;
|
||||
|
||||
name = kasprintf(GFP_KERNEL, "%s#dualdiv_clk", dev_name(dev));
|
||||
if (!name)
|
||||
return -ENOMEM;
|
||||
|
||||
parent_name = __clk_get_name(ao_cec->oscin);
|
||||
|
||||
init.name = name;
|
||||
init.ops = &meson_ao_cec_g12a_dualdiv_clk_ops;
|
||||
init.flags = 0;
|
||||
init.parent_names = &parent_name;
|
||||
init.num_parents = 1;
|
||||
dualdiv_clk->regmap = ao_cec->regmap;
|
||||
dualdiv_clk->hw.init = &init;
|
||||
|
||||
clk = devm_clk_register(dev, &dualdiv_clk->hw);
|
||||
kfree(name);
|
||||
if (IS_ERR(clk)) {
|
||||
dev_err(dev, "failed to register clock\n");
|
||||
return PTR_ERR(clk);
|
||||
}
|
||||
|
||||
ao_cec->core = clk;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int meson_ao_cec_g12a_read(void *context, unsigned int addr,
|
||||
unsigned int *data)
|
||||
{
|
||||
struct meson_ao_cec_g12a_device *ao_cec = context;
|
||||
u32 reg = FIELD_PREP(CECB_RW_ADDR, addr);
|
||||
unsigned long flags;
|
||||
int ret = 0;
|
||||
|
||||
spin_lock_irqsave(&ao_cec->cec_reg_lock, flags);
|
||||
|
||||
ret = regmap_write(ao_cec->regmap, CECB_RW_REG, reg);
|
||||
if (ret)
|
||||
goto read_out;
|
||||
|
||||
ret = regmap_read_poll_timeout(ao_cec->regmap, CECB_RW_REG, reg,
|
||||
!(reg & CECB_RW_BUS_BUSY),
|
||||
5, 1000);
|
||||
if (ret)
|
||||
goto read_out;
|
||||
|
||||
ret = regmap_read(ao_cec->regmap, CECB_RW_REG, ®);
|
||||
|
||||
*data = FIELD_GET(CECB_RW_RD_DATA, reg);
|
||||
|
||||
read_out:
|
||||
spin_unlock_irqrestore(&ao_cec->cec_reg_lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int meson_ao_cec_g12a_write(void *context, unsigned int addr,
|
||||
unsigned int data)
|
||||
{
|
||||
struct meson_ao_cec_g12a_device *ao_cec = context;
|
||||
unsigned long flags;
|
||||
u32 reg = FIELD_PREP(CECB_RW_ADDR, addr) |
|
||||
FIELD_PREP(CECB_RW_WR_DATA, data) |
|
||||
CECB_RW_WRITE_EN;
|
||||
int ret = 0;
|
||||
|
||||
spin_lock_irqsave(&ao_cec->cec_reg_lock, flags);
|
||||
|
||||
ret = regmap_write(ao_cec->regmap, CECB_RW_REG, reg);
|
||||
|
||||
spin_unlock_irqrestore(&ao_cec->cec_reg_lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct regmap_config meson_ao_cec_g12a_cec_regmap_conf = {
|
||||
.reg_bits = 8,
|
||||
.val_bits = 8,
|
||||
.reg_read = meson_ao_cec_g12a_read,
|
||||
.reg_write = meson_ao_cec_g12a_write,
|
||||
.max_register = 0xffff,
|
||||
.fast_io = true,
|
||||
};
|
||||
|
||||
static inline void
|
||||
meson_ao_cec_g12a_irq_setup(struct meson_ao_cec_g12a_device *ao_cec,
|
||||
bool enable)
|
||||
{
|
||||
u32 cfg = CECB_INTR_DONE | CECB_INTR_EOM | CECB_INTR_NACK |
|
||||
CECB_INTR_ARB_LOSS | CECB_INTR_INITIATOR_ERR |
|
||||
CECB_INTR_FOLLOWER_ERR;
|
||||
|
||||
regmap_write(ao_cec->regmap, CECB_INTR_MASKN_REG,
|
||||
enable ? cfg : 0);
|
||||
}
|
||||
|
||||
static void meson_ao_cec_g12a_irq_rx(struct meson_ao_cec_g12a_device *ao_cec)
|
||||
{
|
||||
int i, ret = 0;
|
||||
u32 val;
|
||||
|
||||
ret = regmap_read(ao_cec->regmap_cec, CECB_RX_CNT, &val);
|
||||
|
||||
ao_cec->rx_msg.len = val;
|
||||
if (ao_cec->rx_msg.len > CEC_MAX_MSG_SIZE)
|
||||
ao_cec->rx_msg.len = CEC_MAX_MSG_SIZE;
|
||||
|
||||
for (i = 0; i < ao_cec->rx_msg.len; i++) {
|
||||
ret |= regmap_read(ao_cec->regmap_cec,
|
||||
CECB_RX_DATA00 + i, &val);
|
||||
|
||||
ao_cec->rx_msg.msg[i] = val & 0xff;
|
||||
}
|
||||
|
||||
ret |= regmap_write(ao_cec->regmap_cec, CECB_LOCK_BUF, 0);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
cec_received_msg(ao_cec->adap, &ao_cec->rx_msg);
|
||||
}
|
||||
|
||||
static irqreturn_t meson_ao_cec_g12a_irq(int irq, void *data)
|
||||
{
|
||||
struct meson_ao_cec_g12a_device *ao_cec = data;
|
||||
u32 stat;
|
||||
|
||||
regmap_read(ao_cec->regmap, CECB_INTR_STAT_REG, &stat);
|
||||
if (stat)
|
||||
return IRQ_WAKE_THREAD;
|
||||
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
static irqreturn_t meson_ao_cec_g12a_irq_thread(int irq, void *data)
|
||||
{
|
||||
struct meson_ao_cec_g12a_device *ao_cec = data;
|
||||
u32 stat;
|
||||
|
||||
regmap_read(ao_cec->regmap, CECB_INTR_STAT_REG, &stat);
|
||||
regmap_write(ao_cec->regmap, CECB_INTR_CLR_REG, stat);
|
||||
|
||||
if (stat & CECB_INTR_DONE)
|
||||
cec_transmit_attempt_done(ao_cec->adap, CEC_TX_STATUS_OK);
|
||||
|
||||
if (stat & CECB_INTR_EOM)
|
||||
meson_ao_cec_g12a_irq_rx(ao_cec);
|
||||
|
||||
if (stat & CECB_INTR_NACK)
|
||||
cec_transmit_attempt_done(ao_cec->adap, CEC_TX_STATUS_NACK);
|
||||
|
||||
if (stat & CECB_INTR_ARB_LOSS) {
|
||||
regmap_write(ao_cec->regmap_cec, CECB_TX_CNT, 0);
|
||||
regmap_update_bits(ao_cec->regmap_cec, CECB_CTRL,
|
||||
CECB_CTRL_SEND | CECB_CTRL_TYPE, 0);
|
||||
cec_transmit_attempt_done(ao_cec->adap, CEC_TX_STATUS_ARB_LOST);
|
||||
}
|
||||
|
||||
/* Initiator reports an error on the CEC bus */
|
||||
if (stat & CECB_INTR_INITIATOR_ERR)
|
||||
cec_transmit_attempt_done(ao_cec->adap, CEC_TX_STATUS_ERROR);
|
||||
|
||||
/* Follower reports a receive error, just reset RX buffer */
|
||||
if (stat & CECB_INTR_FOLLOWER_ERR)
|
||||
regmap_write(ao_cec->regmap_cec, CECB_LOCK_BUF, 0);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int
|
||||
meson_ao_cec_g12a_set_log_addr(struct cec_adapter *adap, u8 logical_addr)
|
||||
{
|
||||
struct meson_ao_cec_g12a_device *ao_cec = adap->priv;
|
||||
int ret = 0;
|
||||
|
||||
if (logical_addr == CEC_LOG_ADDR_INVALID) {
|
||||
/* Assume this will allways succeed */
|
||||
regmap_write(ao_cec->regmap_cec, CECB_LADD_LOW, 0);
|
||||
regmap_write(ao_cec->regmap_cec, CECB_LADD_HIGH, 0);
|
||||
|
||||
return 0;
|
||||
} else if (logical_addr < 8) {
|
||||
ret = regmap_update_bits(ao_cec->regmap_cec, CECB_LADD_LOW,
|
||||
BIT(logical_addr),
|
||||
BIT(logical_addr));
|
||||
} else {
|
||||
ret = regmap_update_bits(ao_cec->regmap_cec, CECB_LADD_HIGH,
|
||||
BIT(logical_addr - 8),
|
||||
BIT(logical_addr - 8));
|
||||
}
|
||||
|
||||
/* Always set Broadcast/Unregistered 15 address */
|
||||
ret |= regmap_update_bits(ao_cec->regmap_cec, CECB_LADD_HIGH,
|
||||
BIT(CEC_LOG_ADDR_UNREGISTERED - 8),
|
||||
BIT(CEC_LOG_ADDR_UNREGISTERED - 8));
|
||||
|
||||
return ret ? -EIO : 0;
|
||||
}
|
||||
|
||||
static int meson_ao_cec_g12a_transmit(struct cec_adapter *adap, u8 attempts,
|
||||
u32 signal_free_time, struct cec_msg *msg)
|
||||
{
|
||||
struct meson_ao_cec_g12a_device *ao_cec = adap->priv;
|
||||
unsigned int type;
|
||||
int ret = 0;
|
||||
u32 val;
|
||||
int i;
|
||||
|
||||
/* Check if RX is in progress */
|
||||
ret = regmap_read(ao_cec->regmap_cec, CECB_LOCK_BUF, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (val & CECB_LOCK_BUF_EN)
|
||||
return -EBUSY;
|
||||
|
||||
/* Check if TX Busy */
|
||||
ret = regmap_read(ao_cec->regmap_cec, CECB_CTRL, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (val & CECB_CTRL_SEND)
|
||||
return -EBUSY;
|
||||
|
||||
switch (signal_free_time) {
|
||||
case CEC_SIGNAL_FREE_TIME_RETRY:
|
||||
type = CECB_CTRL_TYPE_RETRY;
|
||||
break;
|
||||
case CEC_SIGNAL_FREE_TIME_NEXT_XFER:
|
||||
type = CECB_CTRL_TYPE_NEXT;
|
||||
break;
|
||||
case CEC_SIGNAL_FREE_TIME_NEW_INITIATOR:
|
||||
default:
|
||||
type = CECB_CTRL_TYPE_NEW;
|
||||
break;
|
||||
}
|
||||
|
||||
for (i = 0; i < msg->len; i++)
|
||||
ret |= regmap_write(ao_cec->regmap_cec, CECB_TX_DATA00 + i,
|
||||
msg->msg[i]);
|
||||
|
||||
ret |= regmap_write(ao_cec->regmap_cec, CECB_TX_CNT, msg->len);
|
||||
if (ret)
|
||||
return -EIO;
|
||||
|
||||
ret = regmap_update_bits(ao_cec->regmap_cec, CECB_CTRL,
|
||||
CECB_CTRL_SEND |
|
||||
CECB_CTRL_TYPE,
|
||||
CECB_CTRL_SEND |
|
||||
FIELD_PREP(CECB_CTRL_TYPE, type));
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int meson_ao_cec_g12a_adap_enable(struct cec_adapter *adap, bool enable)
|
||||
{
|
||||
struct meson_ao_cec_g12a_device *ao_cec = adap->priv;
|
||||
|
||||
meson_ao_cec_g12a_irq_setup(ao_cec, false);
|
||||
|
||||
regmap_update_bits(ao_cec->regmap, CECB_GEN_CNTL_REG,
|
||||
CECB_GEN_CNTL_RESET, CECB_GEN_CNTL_RESET);
|
||||
|
||||
if (!enable)
|
||||
return 0;
|
||||
|
||||
/* Setup Filter */
|
||||
regmap_update_bits(ao_cec->regmap, CECB_GEN_CNTL_REG,
|
||||
CECB_GEN_CNTL_FILTER_TICK_SEL |
|
||||
CECB_GEN_CNTL_FILTER_DEL,
|
||||
FIELD_PREP(CECB_GEN_CNTL_FILTER_TICK_SEL,
|
||||
CECB_GEN_CNTL_FILTER_TICK_1US) |
|
||||
FIELD_PREP(CECB_GEN_CNTL_FILTER_DEL, 7));
|
||||
|
||||
/* Enable System Clock */
|
||||
regmap_update_bits(ao_cec->regmap, CECB_GEN_CNTL_REG,
|
||||
CECB_GEN_CNTL_SYS_CLK_EN,
|
||||
CECB_GEN_CNTL_SYS_CLK_EN);
|
||||
|
||||
/* Enable gated clock (Normal mode). */
|
||||
regmap_update_bits(ao_cec->regmap, CECB_GEN_CNTL_REG,
|
||||
CECB_GEN_CNTL_CLK_CTRL_MASK,
|
||||
FIELD_PREP(CECB_GEN_CNTL_CLK_CTRL_MASK,
|
||||
CECB_GEN_CNTL_CLK_ENABLE));
|
||||
|
||||
/* Release Reset */
|
||||
regmap_update_bits(ao_cec->regmap, CECB_GEN_CNTL_REG,
|
||||
CECB_GEN_CNTL_RESET, 0);
|
||||
|
||||
meson_ao_cec_g12a_irq_setup(ao_cec, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct cec_adap_ops meson_ao_cec_g12a_ops = {
|
||||
.adap_enable = meson_ao_cec_g12a_adap_enable,
|
||||
.adap_log_addr = meson_ao_cec_g12a_set_log_addr,
|
||||
.adap_transmit = meson_ao_cec_g12a_transmit,
|
||||
};
|
||||
|
||||
static int meson_ao_cec_g12a_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct meson_ao_cec_g12a_device *ao_cec;
|
||||
struct device *hdmi_dev;
|
||||
struct resource *res;
|
||||
void __iomem *base;
|
||||
int ret, irq;
|
||||
|
||||
hdmi_dev = cec_notifier_parse_hdmi_phandle(&pdev->dev);
|
||||
if (IS_ERR(hdmi_dev))
|
||||
return PTR_ERR(hdmi_dev);
|
||||
|
||||
ao_cec = devm_kzalloc(&pdev->dev, sizeof(*ao_cec), GFP_KERNEL);
|
||||
if (!ao_cec)
|
||||
return -ENOMEM;
|
||||
|
||||
spin_lock_init(&ao_cec->cec_reg_lock);
|
||||
ao_cec->pdev = pdev;
|
||||
|
||||
ao_cec->notify = cec_notifier_get(hdmi_dev);
|
||||
if (!ao_cec->notify)
|
||||
return -ENOMEM;
|
||||
|
||||
ao_cec->adap = cec_allocate_adapter(&meson_ao_cec_g12a_ops, ao_cec,
|
||||
"meson_g12a_ao_cec",
|
||||
CEC_CAP_DEFAULTS,
|
||||
CEC_MAX_LOG_ADDRS);
|
||||
if (IS_ERR(ao_cec->adap)) {
|
||||
ret = PTR_ERR(ao_cec->adap);
|
||||
goto out_probe_notify;
|
||||
}
|
||||
|
||||
ao_cec->adap->owner = THIS_MODULE;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
base = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(base)) {
|
||||
ret = PTR_ERR(base);
|
||||
goto out_probe_adapter;
|
||||
}
|
||||
|
||||
ao_cec->regmap = devm_regmap_init_mmio(&pdev->dev, base,
|
||||
&meson_ao_cec_g12a_regmap_conf);
|
||||
if (IS_ERR(ao_cec->regmap)) {
|
||||
ret = PTR_ERR(ao_cec->regmap);
|
||||
goto out_probe_adapter;
|
||||
}
|
||||
|
||||
ao_cec->regmap_cec = devm_regmap_init(&pdev->dev, NULL, ao_cec,
|
||||
&meson_ao_cec_g12a_cec_regmap_conf);
|
||||
if (IS_ERR(ao_cec->regmap_cec)) {
|
||||
ret = PTR_ERR(ao_cec->regmap_cec);
|
||||
goto out_probe_adapter;
|
||||
}
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
ret = devm_request_threaded_irq(&pdev->dev, irq,
|
||||
meson_ao_cec_g12a_irq,
|
||||
meson_ao_cec_g12a_irq_thread,
|
||||
0, NULL, ao_cec);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "irq request failed\n");
|
||||
goto out_probe_adapter;
|
||||
}
|
||||
|
||||
ao_cec->oscin = devm_clk_get(&pdev->dev, "oscin");
|
||||
if (IS_ERR(ao_cec->oscin)) {
|
||||
dev_err(&pdev->dev, "oscin clock request failed\n");
|
||||
ret = PTR_ERR(ao_cec->oscin);
|
||||
goto out_probe_adapter;
|
||||
}
|
||||
|
||||
ret = meson_ao_cec_g12a_setup_clk(ao_cec);
|
||||
if (ret)
|
||||
goto out_probe_adapter;
|
||||
|
||||
ret = clk_prepare_enable(ao_cec->core);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "core clock enable failed\n");
|
||||
goto out_probe_adapter;
|
||||
}
|
||||
|
||||
device_reset_optional(&pdev->dev);
|
||||
|
||||
platform_set_drvdata(pdev, ao_cec);
|
||||
|
||||
ret = cec_register_adapter(ao_cec->adap, &pdev->dev);
|
||||
if (ret < 0) {
|
||||
cec_notifier_put(ao_cec->notify);
|
||||
goto out_probe_core_clk;
|
||||
}
|
||||
|
||||
/* Setup Hardware */
|
||||
regmap_write(ao_cec->regmap, CECB_GEN_CNTL_REG, CECB_GEN_CNTL_RESET);
|
||||
|
||||
cec_register_cec_notifier(ao_cec->adap, ao_cec->notify);
|
||||
|
||||
return 0;
|
||||
|
||||
out_probe_core_clk:
|
||||
clk_disable_unprepare(ao_cec->core);
|
||||
|
||||
out_probe_adapter:
|
||||
cec_delete_adapter(ao_cec->adap);
|
||||
|
||||
out_probe_notify:
|
||||
cec_notifier_put(ao_cec->notify);
|
||||
|
||||
dev_err(&pdev->dev, "CEC controller registration failed\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int meson_ao_cec_g12a_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct meson_ao_cec_g12a_device *ao_cec = platform_get_drvdata(pdev);
|
||||
|
||||
clk_disable_unprepare(ao_cec->core);
|
||||
|
||||
cec_unregister_adapter(ao_cec->adap);
|
||||
|
||||
cec_notifier_put(ao_cec->notify);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id meson_ao_cec_g12a_of_match[] = {
|
||||
{ .compatible = "amlogic,meson-g12a-ao-cec", },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, meson_ao_cec_g12a_of_match);
|
||||
|
||||
static struct platform_driver meson_ao_cec_g12a_driver = {
|
||||
.probe = meson_ao_cec_g12a_probe,
|
||||
.remove = meson_ao_cec_g12a_remove,
|
||||
.driver = {
|
||||
.name = "meson-ao-cec-g12a",
|
||||
.of_match_table = of_match_ptr(meson_ao_cec_g12a_of_match),
|
||||
},
|
||||
};
|
||||
|
||||
module_platform_driver(meson_ao_cec_g12a_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Meson AO CEC G12A Controller driver");
|
||||
MODULE_AUTHOR("Neil Armstrong <[email protected]>");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
@ -601,20 +601,14 @@ static const struct cec_adap_ops meson_ao_cec_ops = {
|
|||
static int meson_ao_cec_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct meson_ao_cec_device *ao_cec;
|
||||
struct platform_device *hdmi_dev;
|
||||
struct device_node *np;
|
||||
struct device *hdmi_dev;
|
||||
struct resource *res;
|
||||
int ret, irq;
|
||||
|
||||
np = of_parse_phandle(pdev->dev.of_node, "hdmi-phandle", 0);
|
||||
if (!np) {
|
||||
dev_err(&pdev->dev, "Failed to find hdmi node\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
hdmi_dev = cec_notifier_parse_hdmi_phandle(&pdev->dev);
|
||||
|
||||
hdmi_dev = of_find_device_by_node(np);
|
||||
if (hdmi_dev == NULL)
|
||||
return -EPROBE_DEFER;
|
||||
if (IS_ERR(hdmi_dev))
|
||||
return PTR_ERR(hdmi_dev);
|
||||
|
||||
ao_cec = devm_kzalloc(&pdev->dev, sizeof(*ao_cec), GFP_KERNEL);
|
||||
if (!ao_cec)
|
||||
|
|
@ -622,7 +616,7 @@ static int meson_ao_cec_probe(struct platform_device *pdev)
|
|||
|
||||
spin_lock_init(&ao_cec->cec_reg_lock);
|
||||
|
||||
ao_cec->notify = cec_notifier_get(&hdmi_dev->dev);
|
||||
ao_cec->notify = cec_notifier_get(hdmi_dev);
|
||||
if (!ao_cec->notify)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
|
|||
|
|
@ -129,11 +129,9 @@ static struct vb2_buffer *get_display_buffer(struct mtk_vcodec_ctx *ctx)
|
|||
mutex_lock(&ctx->lock);
|
||||
if (dstbuf->used) {
|
||||
vb2_set_plane_payload(&dstbuf->vb.vb2_buf, 0,
|
||||
ctx->picinfo.y_bs_sz);
|
||||
ctx->picinfo.fb_sz[0]);
|
||||
vb2_set_plane_payload(&dstbuf->vb.vb2_buf, 1,
|
||||
ctx->picinfo.c_bs_sz);
|
||||
|
||||
dstbuf->ready_to_display = true;
|
||||
ctx->picinfo.fb_sz[1]);
|
||||
|
||||
mtk_v4l2_debug(2,
|
||||
"[%d]status=%x queue id=%d to done_list %d",
|
||||
|
|
@ -278,6 +276,27 @@ static void mtk_vdec_flush_decoder(struct mtk_vcodec_ctx *ctx)
|
|||
clean_free_buffer(ctx);
|
||||
}
|
||||
|
||||
static void mtk_vdec_update_fmt(struct mtk_vcodec_ctx *ctx,
|
||||
unsigned int pixelformat)
|
||||
{
|
||||
struct mtk_video_fmt *fmt;
|
||||
struct mtk_q_data *dst_q_data;
|
||||
unsigned int k;
|
||||
|
||||
dst_q_data = &ctx->q_data[MTK_Q_DATA_DST];
|
||||
for (k = 0; k < NUM_FORMATS; k++) {
|
||||
fmt = &mtk_video_formats[k];
|
||||
if (fmt->fourcc == pixelformat) {
|
||||
mtk_v4l2_debug(1, "Update cap fourcc(%d -> %d)",
|
||||
dst_q_data->fmt.fourcc, pixelformat);
|
||||
dst_q_data->fmt = fmt;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
mtk_v4l2_err("Cannot get fourcc(%d), using init value", pixelformat);
|
||||
}
|
||||
|
||||
static int mtk_vdec_pic_info_update(struct mtk_vcodec_ctx *ctx)
|
||||
{
|
||||
unsigned int dpbsize = 0;
|
||||
|
|
@ -299,6 +318,10 @@ static int mtk_vdec_pic_info_update(struct mtk_vcodec_ctx *ctx)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (ctx->last_decoded_picinfo.cap_fourcc != ctx->picinfo.cap_fourcc &&
|
||||
ctx->picinfo.cap_fourcc != 0)
|
||||
mtk_vdec_update_fmt(ctx, ctx->picinfo.cap_fourcc);
|
||||
|
||||
if ((ctx->last_decoded_picinfo.pic_w == ctx->picinfo.pic_w) ||
|
||||
(ctx->last_decoded_picinfo.pic_h == ctx->picinfo.pic_h))
|
||||
return 0;
|
||||
|
|
@ -352,11 +375,11 @@ static void mtk_vdec_worker(struct work_struct *work)
|
|||
pfb = &dst_buf_info->frame_buffer;
|
||||
pfb->base_y.va = vb2_plane_vaddr(&dst_buf->vb2_buf, 0);
|
||||
pfb->base_y.dma_addr = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0);
|
||||
pfb->base_y.size = ctx->picinfo.y_bs_sz + ctx->picinfo.y_len_sz;
|
||||
pfb->base_y.size = ctx->picinfo.fb_sz[0];
|
||||
|
||||
pfb->base_c.va = vb2_plane_vaddr(&dst_buf->vb2_buf, 1);
|
||||
pfb->base_c.dma_addr = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 1);
|
||||
pfb->base_c.size = ctx->picinfo.c_bs_sz + ctx->picinfo.c_len_sz;
|
||||
pfb->base_c.size = ctx->picinfo.fb_sz[1];
|
||||
pfb->status = 0;
|
||||
mtk_v4l2_debug(3, "===>[%d] vdec_if_decode() ===>", ctx->id);
|
||||
|
||||
|
|
@ -388,7 +411,7 @@ static void mtk_vdec_worker(struct work_struct *work)
|
|||
}
|
||||
buf.va = vb2_plane_vaddr(&src_buf->vb2_buf, 0);
|
||||
buf.dma_addr = vb2_dma_contig_plane_dma_addr(&src_buf->vb2_buf, 0);
|
||||
buf.size = (size_t)src_buf->planes[0].bytesused;
|
||||
buf.size = (size_t)src_buf->vb2_buf.planes[0].bytesused;
|
||||
if (!buf.va) {
|
||||
v4l2_m2m_job_finish(dev->m2m_dev_dec, ctx->m2m_ctx);
|
||||
mtk_v4l2_err("[%d] id=%d src_addr is NULL!!",
|
||||
|
|
@ -976,14 +999,13 @@ static int vidioc_vdec_g_fmt(struct file *file, void *priv,
|
|||
* So we just return picinfo yet, and update picinfo in
|
||||
* stop_streaming hook function
|
||||
*/
|
||||
q_data->sizeimage[0] = ctx->picinfo.y_bs_sz +
|
||||
ctx->picinfo.y_len_sz;
|
||||
q_data->sizeimage[1] = ctx->picinfo.c_bs_sz +
|
||||
ctx->picinfo.c_len_sz;
|
||||
q_data->sizeimage[0] = ctx->picinfo.fb_sz[0];
|
||||
q_data->sizeimage[1] = ctx->picinfo.fb_sz[1];
|
||||
q_data->bytesperline[0] = ctx->last_decoded_picinfo.buf_w;
|
||||
q_data->bytesperline[1] = ctx->last_decoded_picinfo.buf_w;
|
||||
q_data->coded_width = ctx->picinfo.buf_w;
|
||||
q_data->coded_height = ctx->picinfo.buf_h;
|
||||
ctx->last_decoded_picinfo.cap_fourcc = q_data->fmt->fourcc;
|
||||
|
||||
/*
|
||||
* Width and height are set to the dimensions
|
||||
|
|
@ -1103,10 +1125,11 @@ static void vb2ops_vdec_buf_queue(struct vb2_buffer *vb)
|
|||
struct mtk_vcodec_mem src_mem;
|
||||
bool res_chg = false;
|
||||
int ret = 0;
|
||||
unsigned int dpbsize = 1;
|
||||
unsigned int dpbsize = 1, i = 0;
|
||||
struct mtk_vcodec_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
|
||||
struct vb2_v4l2_buffer *vb2_v4l2 = NULL;
|
||||
struct mtk_video_dec_buf *buf = NULL;
|
||||
struct mtk_q_data *dst_q_data;
|
||||
|
||||
mtk_v4l2_debug(3, "[%d] (%d) id=%d, vb=%p",
|
||||
ctx->id, vb->vb2_queue->type,
|
||||
|
|
@ -1122,11 +1145,9 @@ static void vb2ops_vdec_buf_queue(struct vb2_buffer *vb)
|
|||
v4l2_m2m_buf_queue(ctx->m2m_ctx, vb2_v4l2);
|
||||
buf->queued_in_vb2 = true;
|
||||
buf->queued_in_v4l2 = true;
|
||||
buf->ready_to_display = false;
|
||||
} else {
|
||||
buf->queued_in_vb2 = false;
|
||||
buf->queued_in_v4l2 = true;
|
||||
buf->ready_to_display = false;
|
||||
}
|
||||
mutex_unlock(&ctx->lock);
|
||||
return;
|
||||
|
|
@ -1155,10 +1176,10 @@ static void vb2ops_vdec_buf_queue(struct vb2_buffer *vb)
|
|||
|
||||
src_mem.va = vb2_plane_vaddr(&src_buf->vb2_buf, 0);
|
||||
src_mem.dma_addr = vb2_dma_contig_plane_dma_addr(&src_buf->vb2_buf, 0);
|
||||
src_mem.size = (size_t)src_buf->planes[0].bytesused;
|
||||
src_mem.size = (size_t)src_buf->vb2_buf.planes[0].bytesused;
|
||||
mtk_v4l2_debug(2,
|
||||
"[%d] buf id=%d va=%p dma=%pad size=%zx",
|
||||
ctx->id, src_buf->index,
|
||||
ctx->id, src_buf->vb2_buf.index,
|
||||
src_mem.va, &src_mem.dma_addr,
|
||||
src_mem.size);
|
||||
|
||||
|
|
@ -1182,7 +1203,7 @@ static void vb2ops_vdec_buf_queue(struct vb2_buffer *vb)
|
|||
}
|
||||
mtk_v4l2_debug(ret ? 0 : 1,
|
||||
"[%d] vdec_if_decode() src_buf=%d, size=%zu, fail=%d, res_chg=%d",
|
||||
ctx->id, src_buf->index,
|
||||
ctx->id, src_buf->vb2_buf.index,
|
||||
src_mem.size, ret, res_chg);
|
||||
return;
|
||||
}
|
||||
|
|
@ -1194,21 +1215,18 @@ static void vb2ops_vdec_buf_queue(struct vb2_buffer *vb)
|
|||
}
|
||||
|
||||
ctx->last_decoded_picinfo = ctx->picinfo;
|
||||
ctx->q_data[MTK_Q_DATA_DST].sizeimage[0] =
|
||||
ctx->picinfo.y_bs_sz +
|
||||
ctx->picinfo.y_len_sz;
|
||||
ctx->q_data[MTK_Q_DATA_DST].bytesperline[0] =
|
||||
ctx->picinfo.buf_w;
|
||||
ctx->q_data[MTK_Q_DATA_DST].sizeimage[1] =
|
||||
ctx->picinfo.c_bs_sz +
|
||||
ctx->picinfo.c_len_sz;
|
||||
ctx->q_data[MTK_Q_DATA_DST].bytesperline[1] = ctx->picinfo.buf_w;
|
||||
dst_q_data = &ctx->q_data[MTK_Q_DATA_DST];
|
||||
for (i = 0; i < dst_q_data->fmt->num_planes; i++) {
|
||||
dst_q_data->sizeimage[i] = ctx->picinfo.fb_sz[i];
|
||||
dst_q_data->bytesperline[i] = ctx->picinfo.buf_w;
|
||||
}
|
||||
|
||||
mtk_v4l2_debug(2, "[%d] vdec_if_init() OK wxh=%dx%d pic wxh=%dx%d sz[0]=0x%x sz[1]=0x%x",
|
||||
ctx->id,
|
||||
ctx->picinfo.buf_w, ctx->picinfo.buf_h,
|
||||
ctx->picinfo.pic_w, ctx->picinfo.pic_h,
|
||||
ctx->q_data[MTK_Q_DATA_DST].sizeimage[0],
|
||||
ctx->q_data[MTK_Q_DATA_DST].sizeimage[1]);
|
||||
dst_q_data->sizeimage[0],
|
||||
dst_q_data->sizeimage[1]);
|
||||
|
||||
ret = vdec_if_get_param(ctx, GET_PARAM_DPB_SIZE, &dpbsize);
|
||||
if (dpbsize == 0)
|
||||
|
|
@ -1253,7 +1271,6 @@ static int vb2ops_vdec_buf_init(struct vb2_buffer *vb)
|
|||
|
||||
if (vb->vb2_queue->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
|
||||
buf->used = false;
|
||||
buf->ready_to_display = false;
|
||||
buf->queued_in_v4l2 = false;
|
||||
} else {
|
||||
buf->lastframe = false;
|
||||
|
|
|
|||
|
|
@ -45,7 +45,6 @@ struct vdec_fb {
|
|||
* @list: link list
|
||||
* @used: Capture buffer contain decoded frame data and keep in
|
||||
* codec data structure
|
||||
* @ready_to_display: Capture buffer not display yet
|
||||
* @queued_in_vb2: Capture buffer is queue in vb2
|
||||
* @queued_in_v4l2: Capture buffer is in v4l2 driver, but not in vb2
|
||||
* queue yet
|
||||
|
|
@ -60,7 +59,6 @@ struct mtk_video_dec_buf {
|
|||
struct list_head list;
|
||||
|
||||
bool used;
|
||||
bool ready_to_display;
|
||||
bool queued_in_vb2;
|
||||
bool queued_in_v4l2;
|
||||
bool lastframe;
|
||||
|
|
|
|||
|
|
@ -211,24 +211,20 @@ struct mtk_vcodec_pm {
|
|||
* @pic_h: picture height
|
||||
* @buf_w: picture buffer width (64 aligned up from pic_w)
|
||||
* @buf_h: picture buffer heiht (64 aligned up from pic_h)
|
||||
* @y_bs_sz: Y bitstream size
|
||||
* @c_bs_sz: CbCr bitstream size
|
||||
* @y_len_sz: additional size required to store decompress information for y
|
||||
* plane
|
||||
* @c_len_sz: additional size required to store decompress information for cbcr
|
||||
* plane
|
||||
* @fb_sz: bitstream size of each plane
|
||||
* E.g. suppose picture size is 176x144,
|
||||
* buffer size will be aligned to 176x160.
|
||||
* @cap_fourcc: fourcc number(may changed when resolution change)
|
||||
* @reserved: align struct to 64-bit in order to adjust 32-bit and 64-bit os.
|
||||
*/
|
||||
struct vdec_pic_info {
|
||||
unsigned int pic_w;
|
||||
unsigned int pic_h;
|
||||
unsigned int buf_w;
|
||||
unsigned int buf_h;
|
||||
unsigned int y_bs_sz;
|
||||
unsigned int c_bs_sz;
|
||||
unsigned int y_len_sz;
|
||||
unsigned int c_len_sz;
|
||||
unsigned int fb_sz[VIDEO_MAX_PLANES];
|
||||
unsigned int cap_fourcc;
|
||||
unsigned int reserved;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -894,7 +894,7 @@ static void vb2ops_venc_stop_streaming(struct vb2_queue *q)
|
|||
|
||||
if (q->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
|
||||
while ((dst_buf = v4l2_m2m_dst_buf_remove(ctx->m2m_ctx))) {
|
||||
dst_buf->planes[0].bytesused = 0;
|
||||
dst_buf->vb2_buf.planes[0].bytesused = 0;
|
||||
v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_ERROR);
|
||||
}
|
||||
} else {
|
||||
|
|
@ -947,7 +947,7 @@ static int mtk_venc_encode_header(void *priv)
|
|||
|
||||
bs_buf.va = vb2_plane_vaddr(&dst_buf->vb2_buf, 0);
|
||||
bs_buf.dma_addr = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0);
|
||||
bs_buf.size = (size_t)dst_buf->planes[0].length;
|
||||
bs_buf.size = (size_t)dst_buf->vb2_buf.planes[0].length;
|
||||
|
||||
mtk_v4l2_debug(1,
|
||||
"[%d] buf id=%d va=0x%p dma_addr=0x%llx size=%zu",
|
||||
|
|
@ -976,7 +976,7 @@ static int mtk_venc_encode_header(void *priv)
|
|||
}
|
||||
|
||||
ctx->state = MTK_STATE_HEADER;
|
||||
dst_buf->planes[0].bytesused = enc_result.bs_size;
|
||||
dst_buf->vb2_buf.planes[0].bytesused = enc_result.bs_size;
|
||||
v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_DONE);
|
||||
|
||||
return 0;
|
||||
|
|
@ -1107,12 +1107,12 @@ static void mtk_venc_worker(struct work_struct *work)
|
|||
|
||||
if (ret) {
|
||||
v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR);
|
||||
dst_buf->planes[0].bytesused = 0;
|
||||
dst_buf->vb2_buf.planes[0].bytesused = 0;
|
||||
v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_ERROR);
|
||||
mtk_v4l2_err("venc_if_encode failed=%d", ret);
|
||||
} else {
|
||||
v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_DONE);
|
||||
dst_buf->planes[0].bytesused = enc_result.bs_size;
|
||||
dst_buf->vb2_buf.planes[0].bytesused = enc_result.bs_size;
|
||||
v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_DONE);
|
||||
mtk_v4l2_debug(2, "venc_if_encode bs size=%d",
|
||||
enc_result.bs_size);
|
||||
|
|
|
|||
|
|
@ -253,8 +253,8 @@ static void get_pic_info(struct vdec_h264_inst *inst,
|
|||
*pic = inst->vsi->pic;
|
||||
mtk_vcodec_debug(inst, "pic(%d, %d), buf(%d, %d)",
|
||||
pic->pic_w, pic->pic_h, pic->buf_w, pic->buf_h);
|
||||
mtk_vcodec_debug(inst, "Y(%d, %d), C(%d, %d)", pic->y_bs_sz,
|
||||
pic->y_len_sz, pic->c_bs_sz, pic->c_len_sz);
|
||||
mtk_vcodec_debug(inst, "fb size: Y(%d), C(%d)",
|
||||
pic->fb_sz[0], pic->fb_sz[1]);
|
||||
}
|
||||
|
||||
static void get_crop_info(struct vdec_h264_inst *inst, struct v4l2_rect *cr)
|
||||
|
|
|
|||
|
|
@ -294,8 +294,8 @@ static void get_pic_info(struct vdec_vp8_inst *inst, struct vdec_pic_info *pic)
|
|||
|
||||
mtk_vcodec_debug(inst, "pic(%d, %d), buf(%d, %d)",
|
||||
pic->pic_w, pic->pic_h, pic->buf_w, pic->buf_h);
|
||||
mtk_vcodec_debug(inst, "Y(%d, %d), C(%d, %d)", pic->y_bs_sz,
|
||||
pic->y_len_sz, pic->c_bs_sz, pic->c_len_sz);
|
||||
mtk_vcodec_debug(inst, "fb size: Y(%d), C(%d)",
|
||||
pic->fb_sz[0], pic->fb_sz[1]);
|
||||
}
|
||||
|
||||
static void vp8_dec_finish(struct vdec_vp8_inst *inst)
|
||||
|
|
|
|||
|
|
@ -481,15 +481,15 @@ static void vp9_swap_frm_bufs(struct vdec_vp9_inst *inst)
|
|||
*/
|
||||
if ((frm_to_show->fb != NULL) &&
|
||||
(inst->cur_fb->base_y.size >=
|
||||
frm_to_show->fb->base_y.size)) {
|
||||
frm_to_show->fb->base_y.size) &&
|
||||
(inst->cur_fb->base_c.size >=
|
||||
frm_to_show->fb->base_c.size)) {
|
||||
memcpy((void *)inst->cur_fb->base_y.va,
|
||||
(void *)frm_to_show->fb->base_y.va,
|
||||
vsi->buf_w *
|
||||
vsi->buf_h);
|
||||
frm_to_show->fb->base_y.size);
|
||||
memcpy((void *)inst->cur_fb->base_c.va,
|
||||
(void *)frm_to_show->fb->base_c.va,
|
||||
vsi->buf_w *
|
||||
vsi->buf_h / 2);
|
||||
frm_to_show->fb->base_c.size);
|
||||
} else {
|
||||
/* After resolution change case, current CAPTURE buffer
|
||||
* may have less buffer size than frm_to_show buffer
|
||||
|
|
@ -702,10 +702,8 @@ static void init_all_fb_lists(struct vdec_vp9_inst *inst)
|
|||
|
||||
static void get_pic_info(struct vdec_vp9_inst *inst, struct vdec_pic_info *pic)
|
||||
{
|
||||
pic->y_bs_sz = inst->vsi->buf_sz_y_bs;
|
||||
pic->c_bs_sz = inst->vsi->buf_sz_c_bs;
|
||||
pic->y_len_sz = inst->vsi->buf_len_sz_y;
|
||||
pic->c_len_sz = inst->vsi->buf_len_sz_c;
|
||||
pic->fb_sz[0] = inst->vsi->buf_sz_y_bs + inst->vsi->buf_len_sz_y;
|
||||
pic->fb_sz[1] = inst->vsi->buf_sz_c_bs + inst->vsi->buf_len_sz_c;
|
||||
|
||||
pic->pic_w = inst->vsi->pic_w;
|
||||
pic->pic_h = inst->vsi->pic_h;
|
||||
|
|
@ -714,8 +712,9 @@ static void get_pic_info(struct vdec_vp9_inst *inst, struct vdec_pic_info *pic)
|
|||
|
||||
mtk_vcodec_debug(inst, "pic(%d, %d), buf(%d, %d)",
|
||||
pic->pic_w, pic->pic_h, pic->buf_w, pic->buf_h);
|
||||
mtk_vcodec_debug(inst, "Y(%d, %d), C(%d, %d)", pic->y_bs_sz,
|
||||
pic->y_len_sz, pic->c_bs_sz, pic->c_len_sz);
|
||||
mtk_vcodec_debug(inst, "fb size: Y(%d), C(%d)",
|
||||
pic->fb_sz[0],
|
||||
pic->fb_sz[1]);
|
||||
}
|
||||
|
||||
static void get_disp_fb(struct vdec_vp9_inst *inst, struct vdec_fb **out_fb)
|
||||
|
|
@ -895,7 +894,7 @@ static int vdec_vp9_decode(unsigned long h_vdec, struct mtk_vcodec_mem *bs,
|
|||
|
||||
if (vsi->resolution_changed) {
|
||||
if (!vp9_alloc_work_buf(inst)) {
|
||||
ret = -EINVAL;
|
||||
ret = -EIO;
|
||||
goto DECODE_ERROR;
|
||||
}
|
||||
}
|
||||
|
|
@ -924,14 +923,12 @@ static int vdec_vp9_decode(unsigned long h_vdec, struct mtk_vcodec_mem *bs,
|
|||
|
||||
if (vsi->show_existing_frame && (vsi->frm_to_show_idx <
|
||||
VP9_MAX_FRM_BUF_NUM)) {
|
||||
mtk_vcodec_err(inst,
|
||||
mtk_vcodec_debug(inst,
|
||||
"Skip Decode drv->new_fb_idx=%d, drv->frm_to_show_idx=%d",
|
||||
vsi->new_fb_idx, vsi->frm_to_show_idx);
|
||||
|
||||
vp9_ref_cnt_fb(inst, &vsi->new_fb_idx,
|
||||
vsi->frm_to_show_idx);
|
||||
ret = -EINVAL;
|
||||
goto DECODE_ERROR;
|
||||
}
|
||||
|
||||
/* VPU assign the buffer pointer in its address space,
|
||||
|
|
|
|||
|
|
@ -614,7 +614,7 @@ static void vpu_init_ipi_handler(void *data, unsigned int len, void *priv)
|
|||
struct vpu_run *run = (struct vpu_run *)data;
|
||||
|
||||
vpu->run.signaled = run->signaled;
|
||||
strncpy(vpu->run.fw_ver, run->fw_ver, VPU_FW_VER_LEN);
|
||||
strscpy(vpu->run.fw_ver, run->fw_ver, sizeof(vpu->run.fw_ver));
|
||||
vpu->run.dec_capability = run->dec_capability;
|
||||
vpu->run.enc_capability = run->enc_capability;
|
||||
wake_up_interruptible(&vpu->run.wq);
|
||||
|
|
|
|||
|
|
@ -385,8 +385,8 @@ static irqreturn_t emmaprp_irq(int irq_emma, void *data)
|
|||
static int vidioc_querycap(struct file *file, void *priv,
|
||||
struct v4l2_capability *cap)
|
||||
{
|
||||
strncpy(cap->driver, MEM2MEM_NAME, sizeof(cap->driver) - 1);
|
||||
strncpy(cap->card, MEM2MEM_NAME, sizeof(cap->card) - 1);
|
||||
strscpy(cap->driver, MEM2MEM_NAME, sizeof(cap->driver));
|
||||
strscpy(cap->card, MEM2MEM_NAME, sizeof(cap->card));
|
||||
cap->device_caps = V4L2_CAP_VIDEO_M2M | V4L2_CAP_STREAMING;
|
||||
cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -14,5 +14,5 @@ config VIDEO_OMAP2_VOUT
|
|||
select OMAP2_VRFB if ARCH_OMAP2 || ARCH_OMAP3
|
||||
select FRAME_VECTOR
|
||||
default n
|
||||
---help---
|
||||
help
|
||||
V4L2 Display driver support for OMAP2/3 based boards.
|
||||
|
|
|
|||
|
|
@ -2350,7 +2350,7 @@ static int pxa_camera_pdata_from_dt(struct device *dev,
|
|||
pcdev->platform_flags |= PXA_CAMERA_PCLK_EN;
|
||||
|
||||
asd->match_type = V4L2_ASYNC_MATCH_FWNODE;
|
||||
remote = of_graph_get_remote_port(np);
|
||||
remote = of_graph_get_remote_port_parent(np);
|
||||
if (remote)
|
||||
asd->match.fwnode = of_fwnode_handle(remote);
|
||||
else
|
||||
|
|
|
|||
|
|
@ -569,7 +569,7 @@ struct hfi_capability {
|
|||
|
||||
struct hfi_capabilities {
|
||||
u32 num_capabilities;
|
||||
struct hfi_capability data[1];
|
||||
struct hfi_capability *data;
|
||||
};
|
||||
|
||||
#define HFI_DEBUG_MSG_LOW 0x01
|
||||
|
|
@ -726,7 +726,7 @@ struct hfi_profile_level {
|
|||
|
||||
struct hfi_profile_level_supported {
|
||||
u32 profile_count;
|
||||
struct hfi_profile_level profile_level[1];
|
||||
struct hfi_profile_level *profile_level;
|
||||
};
|
||||
|
||||
struct hfi_quality_vs_speed {
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue