aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.15/950-0814-media-i2c-imx258-Add-regulator-control.patch
diff options
context:
space:
mode:
authorÁlvaro Fernández Rojas <noltari@gmail.com>2022-05-16 23:40:32 +0200
committerÁlvaro Fernández Rojas <noltari@gmail.com>2022-05-17 15:11:22 +0200
commit20ea6adbf199097c4f5f591ffee088340630dae4 (patch)
treed6719d95e136611a1c25bbf7789652d6d402779d /target/linux/bcm27xx/patches-5.15/950-0814-media-i2c-imx258-Add-regulator-control.patch
parentbca05bd072180dc38ef740b37ded9572a6db1981 (diff)
downloadupstream-20ea6adbf199097c4f5f591ffee088340630dae4.tar.gz
upstream-20ea6adbf199097c4f5f591ffee088340630dae4.tar.bz2
upstream-20ea6adbf199097c4f5f591ffee088340630dae4.zip
bcm27xx: add support for linux v5.15
Build system: x86_64 Build-tested: bcm2708, bcm2709, bcm2710, bcm2711 Run-tested: bcm2708/RPiB+, bcm2709/RPi3B, bcm2710/RPi3B, bcm2711/RPi4B Signed-off-by: Marty Jones <mj8263788@gmail.com> Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
Diffstat (limited to 'target/linux/bcm27xx/patches-5.15/950-0814-media-i2c-imx258-Add-regulator-control.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.15/950-0814-media-i2c-imx258-Add-regulator-control.patch109
1 files changed, 109 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.15/950-0814-media-i2c-imx258-Add-regulator-control.patch b/target/linux/bcm27xx/patches-5.15/950-0814-media-i2c-imx258-Add-regulator-control.patch
new file mode 100644
index 0000000000..069f9bba0a
--- /dev/null
+++ b/target/linux/bcm27xx/patches-5.15/950-0814-media-i2c-imx258-Add-regulator-control.patch
@@ -0,0 +1,109 @@
+From 518075a2587a30a5fb67f2d76e576caf230a4105 Mon Sep 17 00:00:00 2001
+From: Dave Stevenson <dave.stevenson@raspberrypi.com>
+Date: Tue, 15 Jun 2021 18:45:40 +0100
+Subject: [PATCH] media: i2c: imx258: Add regulator control
+
+The device tree bindings define the relevant regulators for the
+sensor, so update the driver to request the regulators and control
+them at the appropriate times.
+
+Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
+---
+ drivers/media/i2c/imx258.c | 42 +++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 41 insertions(+), 1 deletion(-)
+
+--- a/drivers/media/i2c/imx258.c
++++ b/drivers/media/i2c/imx258.c
+@@ -7,6 +7,7 @@
+ #include <linux/i2c.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>
+ #include <media/v4l2-fwnode.h>
+@@ -524,6 +525,16 @@ static const char * const imx258_test_pa
+ "Pseudorandom Sequence (PN9)",
+ };
+
++/* regulator supplies */
++static const char * const imx258_supply_name[] = {
++ /* Supplies can be enabled in any order */
++ "vana", /* Analog (2.8V) supply */
++ "vdig", /* Digital Core (1.05V) supply */
++ "vif", /* IF (1.8V) supply */
++};
++
++#define IMX258_NUM_SUPPLIES ARRAY_SIZE(imx258_supply_name)
++
+ /* Configurations for supported link frequencies */
+ #define IMX258_LINK_FREQ_634MHZ 633600000ULL
+ #define IMX258_LINK_FREQ_320MHZ 320000000ULL
+@@ -633,6 +644,7 @@ struct imx258 {
+ bool streaming;
+
+ struct clk *clk;
++ struct regulator_bulk_data supplies[IMX258_NUM_SUPPLIES];
+ };
+
+ static inline struct imx258 *to_imx258(struct v4l2_subdev *_sd)
+@@ -1030,9 +1042,19 @@ static int imx258_power_on(struct device
+ struct imx258 *imx258 = to_imx258(sd);
+ int ret;
+
++ ret = regulator_bulk_enable(IMX258_NUM_SUPPLIES,
++ imx258->supplies);
++ if (ret) {
++ dev_err(dev, "%s: failed to enable regulators\n",
++ __func__);
++ return ret;
++ }
++
+ ret = clk_prepare_enable(imx258->clk);
+- if (ret)
++ if (ret) {
+ dev_err(dev, "failed to enable clock\n");
++ regulator_bulk_disable(IMX258_NUM_SUPPLIES, imx258->supplies);
++ }
+
+ return ret;
+ }
+@@ -1043,6 +1065,7 @@ static int imx258_power_off(struct devic
+ struct imx258 *imx258 = to_imx258(sd);
+
+ clk_disable_unprepare(imx258->clk);
++ regulator_bulk_disable(IMX258_NUM_SUPPLIES, imx258->supplies);
+
+ return 0;
+ }
+@@ -1285,6 +1308,19 @@ static void imx258_free_controls(struct
+ mutex_destroy(&imx258->mutex);
+ }
+
++static int imx258_get_regulators(struct imx258 *imx258,
++ struct i2c_client *client)
++{
++ unsigned int i;
++
++ for (i = 0; i < IMX258_NUM_SUPPLIES; i++)
++ imx258->supplies[i].supply = imx258_supply_name[i];
++
++ return devm_regulator_bulk_get(&client->dev,
++ IMX258_NUM_SUPPLIES,
++ imx258->supplies);
++}
++
+ static int imx258_probe(struct i2c_client *client)
+ {
+ struct imx258 *imx258;
+@@ -1295,6 +1331,10 @@ static int imx258_probe(struct i2c_clien
+ if (!imx258)
+ return -ENOMEM;
+
++ ret = imx258_get_regulators(imx258, client);
++ if (ret)
++ return ret;
++
+ imx258->clk = devm_clk_get_optional(&client->dev, NULL);
+ if (IS_ERR(imx258->clk))
+ return dev_err_probe(&client->dev, PTR_ERR(imx258->clk),