diff --git a/drivers/media/i2c/dw9807-vcm.c b/drivers/media/i2c/dw9807-vcm.c
index 4148009e0e01..b9f6c44b8246 100644
--- a/drivers/media/i2c/dw9807-vcm.c
+++ b/drivers/media/i2c/dw9807-vcm.c
@@ -1,5 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0
 // Copyright (C) 2018 Intel Corporation
+// TODO: add regulator stuff to power on/down fns and verify camera works after suspend
+// TODO: switch the ipu-bridge id back and add it to the id table here
 
 #include <linux/acpi.h>
 #include <linux/delay.h>
@@ -7,6 +9,7 @@
 #include <linux/iopoll.h>
 #include <linux/module.h>
 #include <linux/pm_runtime.h>
+#include <linux/regulator/consumer.h>
 #include <media/v4l2-ctrls.h>
 #include <media/v4l2-device.h>
 
@@ -42,6 +45,7 @@ struct dw9807_device {
 	struct v4l2_ctrl_handler ctrls_vcm;
 	struct v4l2_subdev sd;
 	u16 current_val;
+	struct regulator *vdd;
 };
 
 static inline struct dw9807_device *sd_to_dw9807_vcm(
@@ -185,6 +189,15 @@ static int dw9807_probe(struct i2c_client *client)
 	if (dw9807_dev == NULL)
 		return -ENOMEM;
 
+	dw9807_dev->vdd = devm_regulator_get(&client->dev, "vdd");
+	if (IS_ERR(dw9807_dev->vdd))
+		return dev_err_probe(&client->dev, PTR_ERR(dw9807_dev->vdd),
+			"cannot get VDD regulator\n");
+
+	rval = regulator_enable(dw9807_dev->vdd);
+	if (rval)
+		goto err_cleanup;
+
 	v4l2_i2c_subdev_init(&dw9807_dev->sd, client, &dw9807_ops);
 	dw9807_dev->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
 	dw9807_dev->sd.internal_ops = &dw9807_int_ops;
@@ -291,6 +304,12 @@ static int  __maybe_unused dw9807_vcm_resume(struct device *dev)
 	return 0;
 }
 
+static const struct i2c_device_id dw9807_id_table[] = {
+	{ "dw9807" },
+	{ }
+};
+MODULE_DEVICE_TABLE(i2c, dw9807_id_table);
+
 static const struct of_device_id dw9807_of_table[] = {
 	{ .compatible = "dongwoon,dw9807-vcm" },
 	/* Compatibility for older firmware, NEVER USE THIS IN FIRMWARE! */
@@ -312,6 +331,7 @@ static struct i2c_driver dw9807_i2c_driver = {
 	},
 	.probe = dw9807_probe,
 	.remove = dw9807_remove,
+	.id_table = dw9807_id_table,
 };
 
 module_i2c_driver(dw9807_i2c_driver);
diff --git a/drivers/media/i2c/imx258.c b/drivers/media/i2c/imx258.c
index e50dcfd830f5..34bfd54d0eb6 100644
--- a/drivers/media/i2c/imx258.c
+++ b/drivers/media/i2c/imx258.c
@@ -4,6 +4,7 @@
 #include <linux/acpi.h>
 #include <linux/clk.h>
 #include <linux/delay.h>
+#include <linux/gpio/consumer.h>
 #include <linux/i2c.h>
 #include <linux/module.h>
 #include <linux/pm_runtime.h>
@@ -680,6 +681,7 @@ struct imx258 {
 	struct mutex mutex;
 
 	struct clk *clk;
+	struct gpio_desc *reset_gpio;
 	struct regulator_bulk_data supplies[IMX258_NUM_SUPPLIES];
 };
 
@@ -1104,6 +1106,9 @@ static int imx258_power_on(struct device *dev)
 	struct imx258 *imx258 = to_imx258(sd);
 	int ret;
 
+	if (imx258->reset_gpio)
+		gpiod_set_value_cansleep(imx258->reset_gpio, 0);
+
 	ret = regulator_bulk_enable(IMX258_NUM_SUPPLIES,
 				    imx258->supplies);
 	if (ret) {
@@ -1118,6 +1123,11 @@ static int imx258_power_on(struct device *dev)
 		regulator_bulk_disable(IMX258_NUM_SUPPLIES, imx258->supplies);
 	}
 
+	if (imx258->reset_gpio) {
+		gpiod_set_value_cansleep(imx258->reset_gpio, 1);
+		usleep_range(1000, 2000); // TODO: See if this is needed
+	}
+
 	return ret;
 }
 
@@ -1126,6 +1136,8 @@ static int imx258_power_off(struct device *dev)
 	struct v4l2_subdev *sd = dev_get_drvdata(dev);
 	struct imx258 *imx258 = to_imx258(sd);
 
+	if (imx258->reset_gpio)
+		gpiod_set_value_cansleep(imx258->reset_gpio, 0);
 	clk_disable_unprepare(imx258->clk);
 	regulator_bulk_disable(IMX258_NUM_SUPPLIES, imx258->supplies);
 
@@ -1370,6 +1382,11 @@ static int imx258_probe(struct i2c_client *client)
 		return ret;
 	}
 
+	imx258->reset_gpio = devm_gpiod_get_optional(imx258->dev, "reset", GPIOD_OUT_HIGH);
+	if (IS_ERR(imx258->reset_gpio))
+		return dev_err_probe(imx258->dev, PTR_ERR(imx258->reset_gpio),
+				     "error getting reset gpio\n");
+
 	ret = imx258_get_regulators(imx258);
 	if (ret)
 		return dev_err_probe(imx258->dev, ret,
diff --git a/drivers/media/pci/intel/ipu-bridge.c b/drivers/media/pci/intel/ipu-bridge.c
index 4e579352ab2c..f71181ac6ec7 100644
--- a/drivers/media/pci/intel/ipu-bridge.c
+++ b/drivers/media/pci/intel/ipu-bridge.c
@@ -90,6 +90,8 @@ static const struct ipu_sensor_config ipu_supported_sensors[] = {
 	IPU_SENSOR_CONFIG("OVTI2680", 1, 331200000),
 	/* Omnivision OV8856 */
 	IPU_SENSOR_CONFIG("OVTI8856", 3, 180000000, 360000000, 720000000),
+	/* Sony IMX258 */
+	IPU_SENSOR_CONFIG("SONY258A", 2, 633600000, 360000000),
 	/* Toshiba T4KA3 */
 	IPU_SENSOR_CONFIG("XMCC0003", 1, 321468000),
 };
@@ -110,7 +112,7 @@ static const char * const ipu_vcm_types[] = {
 	"ad5816",
 	"dw9719",
 	"dw9718",
-	"dw9806b",
+	"dw9807",
 	"wv517s",
 	"lc898122xa",
 	"lc898212axb",
@@ -241,22 +243,6 @@ static int ipu_bridge_read_acpi_buffer(struct acpi_device *adev, char *id,
 	return ret;
 }
 
-static u32 ipu_bridge_parse_rotation(struct acpi_device *adev,
-				     struct ipu_sensor_ssdb *ssdb)
-{
-	switch (ssdb->degree) {
-	case IPU_SENSOR_ROTATION_NORMAL:
-		return 0;
-	case IPU_SENSOR_ROTATION_INVERTED:
-		return 180;
-	default:
-		dev_warn(ADEV_DEV(adev),
-			 "Unknown rotation %d. Assume 0 degree rotation\n",
-			 ssdb->degree);
-		return 0;
-	}
-}
-
 static enum v4l2_fwnode_orientation ipu_bridge_parse_orientation(struct acpi_device *adev)
 {
 	enum v4l2_fwnode_orientation orientation;
@@ -313,7 +299,7 @@ int ipu_bridge_parse_ssdb(struct acpi_device *adev, struct ipu_sensor *sensor)
 	sensor->link = ssdb.link;
 	sensor->lanes = ssdb.lanes;
 	sensor->mclkspeed = ssdb.mclkspeed;
-	sensor->rotation = ipu_bridge_parse_rotation(adev, &ssdb);
+	sensor->rotation = ssdb.degree;
 	sensor->orientation = ipu_bridge_parse_orientation(adev);
 
 	if (ssdb.vcmtype)
diff --git a/drivers/platform/x86/intel/int3472/tps68470_board_data.c b/drivers/platform/x86/intel/int3472/tps68470_board_data.c
index 71357a036292..352d4bc7df42 100644
--- a/drivers/platform/x86/intel/int3472/tps68470_board_data.c
+++ b/drivers/platform/x86/intel/int3472/tps68470_board_data.c
@@ -41,6 +41,23 @@ static struct regulator_consumer_supply int347a_aux2_consumer_supplies[] = {
 	REGULATOR_SUPPLY("vdddo", "i2c-INT347E:00"),
 };
 
+static struct regulator_consumer_supply imx258a_core_consumer_supplies[] = {
+	REGULATOR_SUPPLY("vdig", "i2c-SONY258A:00"),
+};
+
+static struct regulator_consumer_supply imx258a_ana_consumer_supplies[] = {
+	REGULATOR_SUPPLY("vana", "i2c-SONY258A:00"),
+};
+
+static struct regulator_consumer_supply imx258a_vcm_consumer_supplies[] = {
+	REGULATOR_SUPPLY("vdd", "i2c-SONY258A:00-VCM"),
+};
+
+static struct regulator_consumer_supply imx258a_vsio_consumer_supplies[] = {
+	REGULATOR_SUPPLY("vif", "i2c-SONY258A:00"),
+};
+
+
 static const struct regulator_init_data surface_go_tps68470_core_reg_init_data = {
 	.constraints = {
 		.min_uV = 1200000,
@@ -129,6 +146,70 @@ static const struct tps68470_regulator_platform_data surface_go_tps68470_pdata =
 	},
 };
 
+static const struct regulator_init_data nautilus_tps68470_core_reg_init_data = {
+	.constraints = {
+		.min_uV = 1200000,
+		.max_uV = 1200000,
+		.apply_uV = true,
+		.valid_ops_mask = REGULATOR_CHANGE_STATUS,
+	},
+	.num_consumer_supplies = ARRAY_SIZE(imx258a_core_consumer_supplies),
+	.consumer_supplies = imx258a_core_consumer_supplies,
+};
+
+static const struct regulator_init_data nautilus_tps68470_ana_reg_init_data = {
+	.constraints = {
+		.min_uV = 2815200,
+		.max_uV = 2815200,
+		.apply_uV = true,
+		.valid_ops_mask = REGULATOR_CHANGE_STATUS,
+	},
+	.num_consumer_supplies = ARRAY_SIZE(imx258a_ana_consumer_supplies),
+	.consumer_supplies = imx258a_ana_consumer_supplies,
+};
+
+static const struct regulator_init_data nautilus_tps68470_vcm_reg_init_data = {
+	.constraints = {
+		.min_uV = 2815200,
+		.max_uV = 2815200,
+		.apply_uV = true,
+		.valid_ops_mask = REGULATOR_CHANGE_STATUS,
+	},
+	.num_consumer_supplies = ARRAY_SIZE(imx258a_vcm_consumer_supplies),
+	.consumer_supplies = imx258a_vcm_consumer_supplies,
+};
+
+/* Ensure the always-on VIO regulator has the same voltage as VSIO */
+static const struct regulator_init_data nautilus_tps68470_vio_reg_init_data = {
+	.constraints = {
+		.min_uV = 1800600,
+		.max_uV = 1800600,
+		.apply_uV = true,
+		.always_on = true,
+	},
+};
+
+static const struct regulator_init_data nautilus_tps68470_vsio_reg_init_data = {
+	.constraints = {
+		.min_uV = 1800600,
+		.max_uV = 1800600,
+		.apply_uV = true,
+		.valid_ops_mask = REGULATOR_CHANGE_STATUS,
+	},
+	.num_consumer_supplies = ARRAY_SIZE(imx258a_vsio_consumer_supplies),
+	.consumer_supplies = imx258a_vsio_consumer_supplies,
+};
+
+static const struct tps68470_regulator_platform_data nautilus_pdata = {
+	.reg_init_data = {
+		[TPS68470_CORE] = &nautilus_tps68470_core_reg_init_data,
+		[TPS68470_ANA]  = &nautilus_tps68470_ana_reg_init_data,
+		[TPS68470_VCM]  = &nautilus_tps68470_vcm_reg_init_data,
+		[TPS68470_VIO] = &nautilus_tps68470_vio_reg_init_data,
+		[TPS68470_VSIO] = &nautilus_tps68470_vsio_reg_init_data,
+	},
+};
+
 /* Settings for Dell 7212 Tablet */
 
 static struct regulator_consumer_supply int3479_vsio_consumer_supplies[] = {
@@ -258,6 +339,23 @@ static struct gpiod_lookup_table dell_7212_int3479_gpios = {
 	}
 };
 
+static struct gpiod_lookup_table samsung_nautilus_galaxybook12_gpios = {
+    .dev_id = "i2c-SONY258A:00",
+    .table = {
+        GPIO_LOOKUP("tps68470-gpio", 9, "reset", GPIO_ACTIVE_HIGH),
+        { }
+    }
+};
+
+static const struct int3472_tps68470_board_data samsung_nautilus_galaxybook12_board_data = {
+    .dev_name = "i2c-INT3472:00",
+    .tps68470_regulator_pdata = &nautilus_pdata,
+    .n_gpiod_lookups = 1,
+    .tps68470_gpio_lookup_tables = {
+        &samsung_nautilus_galaxybook12_gpios ,
+    },
+};
+
 static const struct int3472_tps68470_board_data surface_go_tps68470_board_data = {
 	.dev_name = "i2c-INT3472:05",
 	.tps68470_regulator_pdata = &surface_go_tps68470_pdata,
@@ -316,6 +414,13 @@ static const struct dmi_system_id int3472_tps68470_board_data_table[] = {
 		},
 		.driver_data = (void *)&dell_7212_tps68470_board_data,
 	},
+	{
+		.matches = {
+			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Google"),
+			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Nautilus"),
+		},
+		.driver_data = (void *)&samsung_nautilus_galaxybook12_board_data,
+	},
 	{ }
 };
 
diff --git a/include/media/ipu-bridge.h b/include/media/ipu-bridge.h
index 16fac765456e..470a7e03d51c 100644
--- a/include/media/ipu-bridge.h
+++ b/include/media/ipu-bridge.h
@@ -13,10 +13,6 @@
 #define IPU_MAX_PORTS				4
 #define MAX_NUM_LINK_FREQS			3
 
-/* Values are educated guesses as we don't have a spec */
-#define IPU_SENSOR_ROTATION_NORMAL		0
-#define IPU_SENSOR_ROTATION_INVERTED		1
-
 #define IPU_SENSOR_CONFIG(_HID, _NR, ...)	\
 	(const struct ipu_sensor_config) {	\
 		.hid = _HID,			\
