From 3c06c14668b09d7a219b2b5553b76b7f9487d31f Mon Sep 17 00:00:00 2001 From: Rebecca Schultz Zavin Date: Wed, 28 Jul 2010 15:16:25 -0700 Subject: [PATCH] media: video: Add stub isp driver for tegra Change-Id: I6ff1bf0e72ef69b59d5875bd60c7cd825fa2ca4f Signed-off-by: Rebecca Schultz Zavin --- drivers/media/video/Kconfig | 1 + drivers/media/video/Makefile | 1 + drivers/media/video/tegra/Kconfig | 0 drivers/media/video/tegra/Makefile | 4 + drivers/media/video/tegra/tegra_isp.c | 107 ++++++++++++++++++++++++++ include/media/tegra_isp.h | 18 +++++ 6 files changed, 131 insertions(+) create mode 100644 drivers/media/video/tegra/Kconfig create mode 100644 drivers/media/video/tegra/Makefile create mode 100644 drivers/media/video/tegra/tegra_isp.c create mode 100644 include/media/tegra_isp.h diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig index f6e4d0475351..e3b374110897 100644 --- a/drivers/media/video/Kconfig +++ b/drivers/media/video/Kconfig @@ -553,6 +553,7 @@ config VIDEO_VIVI source "drivers/media/video/davinci/Kconfig" source "drivers/media/video/omap/Kconfig" +source "drivers/media/video/tegra/Kconfig" source "drivers/media/video/bt8xx/Kconfig" diff --git a/drivers/media/video/Makefile b/drivers/media/video/Makefile index 40f98fba5f88..399ff510d79c 100644 --- a/drivers/media/video/Makefile +++ b/drivers/media/video/Makefile @@ -179,6 +179,7 @@ obj-$(CONFIG_VIDEO_IR_I2C) += ir-kbd-i2c.o obj-y += davinci/ obj-$(CONFIG_ARCH_OMAP) += omap/ +obj-$(CONFIG_ARCH_TEGRA) += tegra/ EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core EXTRA_CFLAGS += -Idrivers/media/dvb/frontends diff --git a/drivers/media/video/tegra/Kconfig b/drivers/media/video/tegra/Kconfig new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/drivers/media/video/tegra/Makefile b/drivers/media/video/tegra/Makefile new file mode 100644 index 000000000000..14375785f061 --- /dev/null +++ b/drivers/media/video/tegra/Makefile @@ -0,0 +1,4 @@ +# +# Makefile for the video capture/playback device drivers. +# +obj-y += tegra_isp.o diff --git a/drivers/media/video/tegra/tegra_isp.c b/drivers/media/video/tegra/tegra_isp.c new file mode 100644 index 000000000000..f82f5d96e331 --- /dev/null +++ b/drivers/media/video/tegra/tegra_isp.c @@ -0,0 +1,107 @@ +/* + * drivers/media/video/tegra/isp.c + * + * Copyright (C) 2010 Google, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include + +/* Eventually this should handle all clock and reset calls for the isp, vi, + * vi_sensor, and csi modules, replacing nvrm and nvos completely for camera + */ +#define TEGRA_ISP_NAME "tegra_isp" + +static struct regulator *tegra_isp_regulator_csi; + +static int tegra_isp_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg) +{ + switch (cmd) { + case TEGRA_ISP_IOCTL_CSI_POWER_ON: + regulator_enable(tegra_isp_regulator_csi); + break; + case TEGRA_ISP_IOCTL_CSI_POWER_OFF: + regulator_disable(tegra_isp_regulator_csi); + break; + default: + pr_err("%s: Unknoown tegra_isp ioctl.\n", TEGRA_ISP_NAME); + } + return 0; +} + +static const struct file_operations tegra_isp_fops = { + .owner = THIS_MODULE, + .ioctl = tegra_isp_ioctl, +}; + +static struct miscdevice tegra_isp_device = { + .minor = MISC_DYNAMIC_MINOR, + .name = TEGRA_ISP_NAME, + .fops = &tegra_isp_fops, +}; + +static int tegra_isp_probe(struct platform_device *pdev) +{ + int err; + + pr_info("%s: probe\n", TEGRA_ISP_NAME); + tegra_isp_regulator_csi = regulator_get(NULL, "vcsi"); + if (IS_ERR(tegra_isp_regulator_csi)) { + pr_err("%s: Couldn't get regulator vcsi\n", TEGRA_ISP_NAME); + return PTR_ERR(tegra_isp_regulator_csi); + } + + err = misc_register(&tegra_isp_device); + if (err) { + pr_err("%s: Unable to register misc device!\n", TEGRA_ISP_NAME); + regulator_put(tegra_isp_regulator_csi); + return err; + } + + /* XXX FIX ME -- SHOULDN'T BE ALWAYS ON! */ + regulator_enable(tegra_isp_regulator_csi); + return 0; +} + +static int tegra_isp_remove(struct platform_device *pdev) +{ + /* XXX FIX ME -- SHOULDN'T BE ALWAYS ON! */ + regulator_disable(tegra_isp_regulator_csi); + misc_deregister(&tegra_isp_device); + return 0; +} + +static struct platform_driver tegra_isp_driver = { + .probe = tegra_isp_probe, + .remove = tegra_isp_remove, + .driver = { .name = TEGRA_ISP_NAME } +}; + +static int __init tegra_isp_init(void) +{ + return platform_driver_register(&tegra_isp_driver); +} + +static void __exit tegra_isp_exit(void) +{ + platform_driver_unregister(&tegra_isp_driver); +} + +module_init(tegra_isp_init); +module_exit(tegra_isp_exit); + diff --git a/include/media/tegra_isp.h b/include/media/tegra_isp.h new file mode 100644 index 000000000000..d1ae23234503 --- /dev/null +++ b/include/media/tegra_isp.h @@ -0,0 +1,18 @@ +/* + * include/linux/tegra_isp.h + * + * Copyright (C) 2010 Google, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#define TEGRA_ISP_IOCTL_CSI_POWER_ON _IO('i', 1) +#define TEGRA_ISP_IOCTL_CSI_POWER_OFF _IO('i', 2) -- 2.34.1