[PATCH v8 1/4] drm/bridge: add support for sn65dsi86 bridge driver

Stephen Boyd swboyd at chromium.org
Mon Jun 11 23:35:46 UTC 2018


Quoting Sandeep Panda (2018-06-04 22:40:15)
> diff --git a/drivers/gpu/drm/bridge/ti-sn65dsi86.c b/drivers/gpu/drm/bridge/ti-sn65dsi86.c
> new file mode 100644
> index 0000000..add6e0f
> --- /dev/null
> +++ b/drivers/gpu/drm/bridge/ti-sn65dsi86.c
> @@ -0,0 +1,666 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (c) 2018, The Linux Foundation. All rights reserved.
> + */
> +
[...]
> +
> +static const struct regmap_config ti_sn_bridge_regmap_config = {
> +       .reg_bits = 8,
> +       .val_bits = 8,
> +       .volatile_table = &ti_sn_bridge_volatile_table,
> +       .cache_type = REGCACHE_NONE,
> +};
> +
> +static void ti_sn_bridge_write_u16(struct ti_sn_bridge *pdata,
> +                                  unsigned int reg, u16 val)
> +{
> +       regmap_write(pdata->regmap, reg, val & 0xFF);
> +       regmap_write(pdata->regmap, reg + 1, val >> 8);
> +}
> +
> +static int __maybe_unused ti_sn_bridge_resume(struct device *dev)
> +{
> +       struct ti_sn_bridge *pdata = dev_get_drvdata(dev);
> +       int ret = 0;

Please don't assign variables and then reassign them again immediately
after. It hides use before real initialization bugs.

> +
> +       ret = regulator_bulk_enable(SN_REGULATOR_SUPPLY_NUM, pdata->supplies);
[...]
> +
> +static int ti_sn_bridge_probe(struct i2c_client *client,
> +        const struct i2c_device_id *id)
> +{
> +       struct ti_sn_bridge *pdata;
> +       struct device_node *ddc_node;
> +       struct mipi_dsi_host *host;
> +       struct mipi_dsi_device *dsi;
> +       int ret = 0;
> +       const struct mipi_dsi_device_info info = { .type = "ti_sn_bridge",
> +                                                  .channel = 0,
> +                                                  .node = NULL,
> +                                                };
> +
> +       if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
> +               DRM_ERROR("device doesn't support I2C\n");
> +               return -ENODEV;
> +       }
> +
> +       ret = ti_sn_bridge_parse_dsi_host(pdata);
> +       if (ret)
> +               return ret;
> +
> +       host = of_find_mipi_dsi_host_by_node(pdata->host_node);
> +       if (!host) {
> +               DRM_ERROR("failed to find dsi host\n");

Not sure we want to print an error and then return -EPROBE_DEFER.
Usually EPROBE_DEFER is silent.

> +               ret = -EPROBE_DEFER;
> +               goto err_dsi_host;
> +       }
> +
[...]
> +
> +       /* TODO: setting to 4 lanes always for now */
> +       dsi->lanes = 4;
> +       dsi->format = MIPI_DSI_FMT_RGB888;
> +       dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
> +                         MIPI_DSI_MODE_EOT_PACKET | MIPI_DSI_MODE_VIDEO_HSE;
> +
> +       ret = mipi_dsi_attach(dsi);
> +       if (ret < 0) {
> +               DRM_ERROR("failed to attach dsi to host\n");
> +               goto err_dsi_attach;
> +       }
> +       pdata->dsi = dsi;
> +
> +       pdata->refclk = devm_clk_get(pdata->dev, "refclk");

We need to check for error

	if (IS_ERR(pdata->refclk))
		
And then if it's EPROBE_DEFER I suppose we would bail out, otherwise
assume it's not present?



More information about the dri-devel mailing list