--- /dev/null
+#ifndef __BACKPORT_LINUX_V4L2_MEDIABUS_H
+#define __BACKPORT_LINUX_V4L2_MEDIABUS_H
+#include <linux/version.h>
+
+/*
+ * SOC_CAMERA is only enabled on 3.4 as it depends on some
+ * newer regulator functionality, however there are some SOC
+ * cameras that can rely on the 3.3 regulatory built-in core
+ * and the 3.3 SOC_CAMERA module however two routines are
+ * not exported in that version of SOC_CAMERA that newer
+ * SOC cameras do require. Backport that functionality.
+ *
+ * Technically this should go into <media/soc_camera.h>
+ * given that is where its where its exported on linux-next
+ * but in practice only placing it here actually fixes linking
+ * errors for 3.3 for all SOC camera drivers we make available
+ * for 3.3.
+ */
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0))
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0))
+#if defined(CPTCFG_VIDEO_DEV_MODULE)
+
+struct soc_camera_subdev_desc;
+
+#define soc_camera_power_on LINUX_BACKPORT(soc_camera_power_on)
+int soc_camera_power_on(struct device *dev,
+ struct soc_camera_subdev_desc *ssdd);
+
+#define soc_camera_power_off LINUX_BACKPORT(soc_camera_power_off)
+int soc_camera_power_off(struct device *dev,
+ struct soc_camera_subdev_desc *ssdd);
+
+#endif /* defined(CPTCFG_VIDEO_DEV_MODULE) */
+#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) */
+#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)) */
+
+#include_next <linux/v4l2-mediabus.h>
+
+#endif /* __BACKPORT_LINUX_V4L2_MEDIABUS_H */
#include <linux/regmap.h>
#include <linux/i2c.h>
#include <linux/spi/spi.h>
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0))
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0))
+#if defined(CPTCFG_VIDEO_DEV_MODULE)
+#include <media/soc_camera.h>
+#include <media/v4l2-common.h>
+#include <media/v4l2-ioctl.h>
+#include <media/v4l2-dev.h>
+#include <media/videobuf-core.h>
+#include <media/videobuf2-core.h>
+#include <media/soc_mediabus.h>
+#include <linux/regulator/consumer.h>
+#endif /* defined(CPTCFG_VIDEO_DEV_MODULE) */
+#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) */
+#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)) */
#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0)) */
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0))
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0))
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0))
+
+#if defined(CPTCFG_VIDEO_V4L2_MODULE)
+int soc_camera_power_on(struct device *dev,
+ struct soc_camera_subdev_desc *ssdd)
+{
+ int ret = regulator_bulk_enable(ssdd->num_regulators,
+ ssdd->regulators);
+ if (ret < 0) {
+ dev_err(dev, "Cannot enable regulators\n");
+ return ret;
+ }
+
+ if (ssdd->power) {
+ ret = ssdd->power(dev, 1);
+ if (ret < 0) {
+ dev_err(dev,
+ "Platform failed to power-on the camera.\n");
+ regulator_bulk_disable(ssdd->num_regulators,
+ ssdd->regulators);
+ }
+ }
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(soc_camera_power_on);
+
+int soc_camera_power_off(struct device *dev,
+ struct soc_camera_subdev_desc *ssdd)
+{
+ int ret = 0;
+ int err;
+
+ if (ssdd->power) {
+ err = ssdd->power(dev, 0);
+ if (err < 0) {
+ dev_err(dev,
+ "Platform failed to power-off the camera.\n");
+ ret = err;
+ }
+ }
+
+ err = regulator_bulk_disable(ssdd->num_regulators,
+ ssdd->regulators);
+ if (err < 0) {
+ dev_err(dev, "Cannot disable regulators\n");
+ ret = ret ? : err;
+ }
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(soc_camera_power_off);
+#endif /* defined(CPTCFG_VIDEO_V4L2_MODULE) */
+
+#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) */
+#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)) */
+
#if defined(CONFIG_REGMAP)
static void devm_regmap_release(struct device *dev, void *res)
{