mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-22 22:07:35 -04:00
media: platform: amd: Introduce amd isp4 capture driver
AMD isp4 capture is a v4l2 media device which implements media controller interface. It has one sub-device (AMD ISP4 sub-device) endpoint which can be connected to a remote CSI2 TX endpoint. It supports only one physical interface for now. Also add ISP4 driver related entry info into the MAINTAINERS file Co-developed-by: Sultan Alsawaf <sultan@kerneltoast.com> Signed-off-by: Sultan Alsawaf <sultan@kerneltoast.com> Co-developed-by: Svetoslav Stoilov <Svetoslav.Stoilov@amd.com> Signed-off-by: Svetoslav Stoilov <Svetoslav.Stoilov@amd.com> Signed-off-by: Bin Du <Bin.Du@amd.com> Reviewed-by: Mario Limonciello (AMD) <superm1@kernel.org> Reviewed-by: Sultan Alsawaf <sultan@kerneltoast.com> Tested-by: Alexey Zagorodnikov <xglooom@gmail.com> Tested-by: Kate Hsuan <hpa@redhat.com> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
This commit is contained in:
13
MAINTAINERS
13
MAINTAINERS
@@ -1152,6 +1152,19 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/iommu/linux.git
|
||||
F: drivers/iommu/amd/
|
||||
F: include/linux/amd-iommu.h
|
||||
|
||||
AMD ISP4 DRIVER
|
||||
M: Bin Du <bin.du@amd.com>
|
||||
M: Nirujogi Pratap <pratap.nirujogi@amd.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://linuxtv.org/media.git
|
||||
F: drivers/media/platform/amd/Kconfig
|
||||
F: drivers/media/platform/amd/Makefile
|
||||
F: drivers/media/platform/amd/isp4/Kconfig
|
||||
F: drivers/media/platform/amd/isp4/Makefile
|
||||
F: drivers/media/platform/amd/isp4/isp4.c
|
||||
F: drivers/media/platform/amd/isp4/isp4.h
|
||||
|
||||
AMD KFD
|
||||
M: Felix Kuehling <Felix.Kuehling@amd.com>
|
||||
L: amd-gfx@lists.freedesktop.org
|
||||
|
||||
@@ -63,6 +63,7 @@ config VIDEO_MUX
|
||||
|
||||
# Platform drivers - Please keep it alphabetically sorted
|
||||
source "drivers/media/platform/allegro-dvt/Kconfig"
|
||||
source "drivers/media/platform/amd/Kconfig"
|
||||
source "drivers/media/platform/amlogic/Kconfig"
|
||||
source "drivers/media/platform/amphion/Kconfig"
|
||||
source "drivers/media/platform/arm/Kconfig"
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
# Place here, alphabetically sorted by directory
|
||||
# (e. g. LC_ALL=C sort Makefile)
|
||||
obj-y += allegro-dvt/
|
||||
obj-y += amd/
|
||||
obj-y += amlogic/
|
||||
obj-y += amphion/
|
||||
obj-y += arm/
|
||||
|
||||
3
drivers/media/platform/amd/Kconfig
Normal file
3
drivers/media/platform/amd/Kconfig
Normal file
@@ -0,0 +1,3 @@
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
|
||||
source "drivers/media/platform/amd/isp4/Kconfig"
|
||||
3
drivers/media/platform/amd/Makefile
Normal file
3
drivers/media/platform/amd/Makefile
Normal file
@@ -0,0 +1,3 @@
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
|
||||
obj-y += isp4/
|
||||
15
drivers/media/platform/amd/isp4/Kconfig
Normal file
15
drivers/media/platform/amd/isp4/Kconfig
Normal file
@@ -0,0 +1,15 @@
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
|
||||
config VIDEO_AMD_ISP4_CAPTURE
|
||||
tristate "AMD ISP4 and camera driver"
|
||||
depends on DRM_AMD_ISP && VIDEO_DEV && HAS_DMA
|
||||
select VIDEOBUF2_CORE
|
||||
select VIDEOBUF2_MEMOPS
|
||||
select VIDEOBUF2_V4L2
|
||||
select VIDEOBUF2_VMALLOC
|
||||
select VIDEO_V4L2_SUBDEV_API
|
||||
help
|
||||
This is support for AMD ISP4 and camera subsystem driver.
|
||||
Say Y here to enable the ISP4 and camera device for video capture.
|
||||
To compile this driver as a module, choose M here. The module will
|
||||
be called amd_isp4_capture.
|
||||
6
drivers/media/platform/amd/isp4/Makefile
Normal file
6
drivers/media/platform/amd/isp4/Makefile
Normal file
@@ -0,0 +1,6 @@
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
# Copyright (C) 2025 Advanced Micro Devices, Inc.
|
||||
|
||||
obj-$(CONFIG_VIDEO_AMD_ISP4_CAPTURE) += amd_isp4_capture.o
|
||||
amd_isp4_capture-objs := isp4.o
|
||||
127
drivers/media/platform/amd/isp4/isp4.c
Normal file
127
drivers/media/platform/amd/isp4/isp4.c
Normal file
@@ -0,0 +1,127 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Copyright (C) 2025 Advanced Micro Devices, Inc.
|
||||
*/
|
||||
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <media/v4l2-ioctl.h>
|
||||
|
||||
#include "isp4.h"
|
||||
|
||||
#define ISP4_DRV_NAME "amd_isp_capture"
|
||||
|
||||
static const struct {
|
||||
const char *name;
|
||||
u32 status_mask;
|
||||
u32 en_mask;
|
||||
u32 ack_mask;
|
||||
u32 rb_int_num;
|
||||
} isp4_irq[] = {
|
||||
/* The IRQ order is aligned with the isp4_subdev.fw_resp_thread order */
|
||||
{
|
||||
.name = "isp_irq_global",
|
||||
.rb_int_num = 4, /* ISP_4_1__SRCID__ISP_RINGBUFFER_WPT12 */
|
||||
},
|
||||
{
|
||||
.name = "isp_irq_stream1",
|
||||
.rb_int_num = 0, /* ISP_4_1__SRCID__ISP_RINGBUFFER_WPT9 */
|
||||
},
|
||||
};
|
||||
|
||||
static irqreturn_t isp4_irq_handler(int irq, void *arg)
|
||||
{
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int isp4_capture_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
int irq[ARRAY_SIZE(isp4_irq)];
|
||||
struct isp4_device *isp_dev;
|
||||
int ret;
|
||||
|
||||
isp_dev = devm_kzalloc(dev, sizeof(*isp_dev), GFP_KERNEL);
|
||||
if (!isp_dev)
|
||||
return -ENOMEM;
|
||||
|
||||
dev->init_name = ISP4_DRV_NAME;
|
||||
|
||||
for (size_t i = 0; i < ARRAY_SIZE(isp4_irq); i++) {
|
||||
irq[i] = platform_get_irq(pdev, isp4_irq[i].rb_int_num);
|
||||
if (irq[i] < 0)
|
||||
return dev_err_probe(dev, irq[i],
|
||||
"fail to get irq %d\n",
|
||||
isp4_irq[i].rb_int_num);
|
||||
|
||||
ret = devm_request_irq(dev, irq[i], isp4_irq_handler,
|
||||
IRQF_NO_AUTOEN, isp4_irq[i].name, dev);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "fail to req irq %d\n",
|
||||
irq[i]);
|
||||
}
|
||||
|
||||
isp_dev->v4l2_dev.mdev = &isp_dev->mdev;
|
||||
|
||||
strscpy(isp_dev->mdev.model, "amd_isp41_mdev",
|
||||
sizeof(isp_dev->mdev.model));
|
||||
isp_dev->mdev.dev = dev;
|
||||
media_device_init(&isp_dev->mdev);
|
||||
|
||||
snprintf(isp_dev->v4l2_dev.name, sizeof(isp_dev->v4l2_dev.name),
|
||||
"AMD-V4L2-ROOT");
|
||||
ret = v4l2_device_register(dev, &isp_dev->v4l2_dev);
|
||||
if (ret) {
|
||||
dev_err_probe(dev, ret, "fail register v4l2 device\n");
|
||||
goto err_clean_media;
|
||||
}
|
||||
|
||||
pm_runtime_set_suspended(dev);
|
||||
pm_runtime_enable(dev);
|
||||
ret = media_device_register(&isp_dev->mdev);
|
||||
if (ret) {
|
||||
dev_err_probe(dev, ret, "fail to register media device\n");
|
||||
goto err_isp4_deinit;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, isp_dev);
|
||||
|
||||
return 0;
|
||||
|
||||
err_isp4_deinit:
|
||||
pm_runtime_disable(dev);
|
||||
v4l2_device_unregister(&isp_dev->v4l2_dev);
|
||||
err_clean_media:
|
||||
media_device_cleanup(&isp_dev->mdev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void isp4_capture_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct isp4_device *isp_dev = platform_get_drvdata(pdev);
|
||||
struct device *dev = &pdev->dev;
|
||||
|
||||
media_device_unregister(&isp_dev->mdev);
|
||||
pm_runtime_disable(dev);
|
||||
v4l2_device_unregister(&isp_dev->v4l2_dev);
|
||||
media_device_cleanup(&isp_dev->mdev);
|
||||
}
|
||||
|
||||
static struct platform_driver isp4_capture_drv = {
|
||||
.probe = isp4_capture_probe,
|
||||
.remove = isp4_capture_remove,
|
||||
.driver = {
|
||||
.name = ISP4_DRV_NAME,
|
||||
}
|
||||
};
|
||||
|
||||
module_platform_driver(isp4_capture_drv);
|
||||
|
||||
MODULE_ALIAS("platform:" ISP4_DRV_NAME);
|
||||
MODULE_IMPORT_NS("DMA_BUF");
|
||||
|
||||
MODULE_DESCRIPTION("AMD ISP4 Driver");
|
||||
MODULE_AUTHOR("Bin Du <bin.du@amd.com>");
|
||||
MODULE_AUTHOR("Pratap Nirujogi <pratap.nirujogi@amd.com>");
|
||||
MODULE_LICENSE("GPL");
|
||||
17
drivers/media/platform/amd/isp4/isp4.h
Normal file
17
drivers/media/platform/amd/isp4/isp4.h
Normal file
@@ -0,0 +1,17 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (C) 2025 Advanced Micro Devices, Inc.
|
||||
*/
|
||||
|
||||
#ifndef _ISP4_H_
|
||||
#define _ISP4_H_
|
||||
|
||||
#include <media/v4l2-device.h>
|
||||
#include <media/videobuf2-memops.h>
|
||||
|
||||
struct isp4_device {
|
||||
struct v4l2_device v4l2_dev;
|
||||
struct media_device mdev;
|
||||
};
|
||||
|
||||
#endif /* _ISP4_H_ */
|
||||
Reference in New Issue
Block a user