Separate the hardware initialization code from setting up the data
structures and parsing the device tree. The purpose of this change is
to provide a single exit point and avoid a waterfall of 'goto's in
the subsequent patch.

Signed-off-by: Alexandru Gagniuc <mr.nuke...@gmail.com>
---
Changes since v1/and v2:
  * Separated this from main patch to better show diff

 drivers/gpu/drm/bridge/sii902x.c | 77 ++++++++++++++++++--------------
 1 file changed, 43 insertions(+), 34 deletions(-)

diff --git a/drivers/gpu/drm/bridge/sii902x.c b/drivers/gpu/drm/bridge/sii902x.c
index 33fd33f953ec..f78c17f49887 100644
--- a/drivers/gpu/drm/bridge/sii902x.c
+++ b/drivers/gpu/drm/bridge/sii902x.c
@@ -954,41 +954,13 @@ static const struct drm_bridge_timings 
default_sii902x_timings = {
                 | DRM_BUS_FLAG_DE_HIGH,
 };
 
-static int sii902x_probe(struct i2c_client *client,
-                        const struct i2c_device_id *id)
+static int sii902x_init(struct sii902x *sii902x)
 {
-       struct device *dev = &client->dev;
+       struct device *dev = &sii902x->i2c->dev;
        unsigned int status = 0;
-       struct sii902x *sii902x;
        u8 chipid[4];
        int ret;
 
-       ret = i2c_check_functionality(client->adapter,
-                                     I2C_FUNC_SMBUS_BYTE_DATA);
-       if (!ret) {
-               dev_err(dev, "I2C adapter not suitable\n");
-               return -EIO;
-       }
-
-       sii902x = devm_kzalloc(dev, sizeof(*sii902x), GFP_KERNEL);
-       if (!sii902x)
-               return -ENOMEM;
-
-       sii902x->i2c = client;
-       sii902x->regmap = devm_regmap_init_i2c(client, &sii902x_regmap_config);
-       if (IS_ERR(sii902x->regmap))
-               return PTR_ERR(sii902x->regmap);
-
-       sii902x->reset_gpio = devm_gpiod_get_optional(dev, "reset",
-                                                     GPIOD_OUT_LOW);
-       if (IS_ERR(sii902x->reset_gpio)) {
-               dev_err(dev, "Failed to retrieve/request reset gpio: %ld\n",
-                       PTR_ERR(sii902x->reset_gpio));
-               return PTR_ERR(sii902x->reset_gpio);
-       }
-
-       mutex_init(&sii902x->mutex);
-
        sii902x_reset(sii902x);
 
        ret = regmap_write(sii902x->regmap, SII902X_REG_TPI_RQB, 0x0);
@@ -1012,11 +984,11 @@ static int sii902x_probe(struct i2c_client *client,
        regmap_read(sii902x->regmap, SII902X_INT_STATUS, &status);
        regmap_write(sii902x->regmap, SII902X_INT_STATUS, status);
 
-       if (client->irq > 0) {
+       if (sii902x->i2c->irq > 0) {
                regmap_write(sii902x->regmap, SII902X_INT_ENABLE,
                             SII902X_HOTPLUG_EVENT);
 
-               ret = devm_request_threaded_irq(dev, client->irq, NULL,
+               ret = devm_request_threaded_irq(dev, sii902x->i2c->irq, NULL,
                                                sii902x_interrupt,
                                                IRQF_ONESHOT, dev_name(dev),
                                                sii902x);
@@ -1031,9 +1003,9 @@ static int sii902x_probe(struct i2c_client *client,
 
        sii902x_audio_codec_init(sii902x, dev);
 
-       i2c_set_clientdata(client, sii902x);
+       i2c_set_clientdata(sii902x->i2c, sii902x);
 
-       sii902x->i2cmux = i2c_mux_alloc(client->adapter, dev,
+       sii902x->i2cmux = i2c_mux_alloc(sii902x->i2c->adapter, dev,
                                        1, 0, I2C_MUX_GATE,
                                        sii902x_i2c_bypass_select,
                                        sii902x_i2c_bypass_deselect);
@@ -1044,6 +1016,43 @@ static int sii902x_probe(struct i2c_client *client,
        return i2c_mux_add_adapter(sii902x->i2cmux, 0, 0, 0);
 }
 
+static int sii902x_probe(struct i2c_client *client,
+                        const struct i2c_device_id *id)
+{
+       struct device *dev = &client->dev;
+       struct sii902x *sii902x;
+       int ret;
+
+       ret = i2c_check_functionality(client->adapter,
+                                     I2C_FUNC_SMBUS_BYTE_DATA);
+       if (!ret) {
+               dev_err(dev, "I2C adapter not suitable\n");
+               return -EIO;
+       }
+
+       sii902x = devm_kzalloc(dev, sizeof(*sii902x), GFP_KERNEL);
+       if (!sii902x)
+               return -ENOMEM;
+
+       sii902x->i2c = client;
+       sii902x->regmap = devm_regmap_init_i2c(client, &sii902x_regmap_config);
+       if (IS_ERR(sii902x->regmap))
+               return PTR_ERR(sii902x->regmap);
+
+       sii902x->reset_gpio = devm_gpiod_get_optional(dev, "reset",
+                                                     GPIOD_OUT_LOW);
+       if (IS_ERR(sii902x->reset_gpio)) {
+               dev_err(dev, "Failed to retrieve/request reset gpio: %ld\n",
+                       PTR_ERR(sii902x->reset_gpio));
+               return PTR_ERR(sii902x->reset_gpio);
+       }
+
+       mutex_init(&sii902x->mutex);
+
+       ret = sii902x_init(sii902x);
+       return ret;
+}
+
 static int sii902x_remove(struct i2c_client *client)
 
 {
-- 
2.26.2

Reply via email to