Re: 答复: [PATCH v2 6/6] drm/panel: Add Ilitek ILI9341 DBI panel driver
From: Laurent Pinchart
Date: Sun Aug 30 2020 - 15:11:58 EST
Hi Paul,
On Sun, Aug 30, 2020 at 06:48:12PM +0200, Paul Cercueil wrote:
> Le dim. 30 août 2020 à 16:36, 何小龙 (Leon He) a écrit :
> >> +struct ili9341 {
> >> + struct drm_panel panel;
> >> + struct mipi_dsi_device *dsi;
> >> + const struct ili9341_pdata *pdata;
> >> +
> >> + struct gpio_desc *reset_gpiod;
> >> + u32 rotation;
> >> +};
> >> +
> >
> > Hi Paul, you put the mipi_dsi_device inside the struct. I think it
> > maybe not
> > a good idea. That means the panel has a MIPI-DSI interface but it
> > doesn't
> > have actually.
> >
> >> +static int ili9341_probe(struct mipi_dsi_device *dsi)
> >> +{
> >> + struct device *dev = &dsi->dev;
> >> + struct ili9341 *priv;
> >> + int ret;
> >> +
> >> + /* See comment for mipi_dbi_spi_init() */
> >> + if (!dev->coherent_dma_mask) {
> >> + ret = dma_coerce_mask_and_coherent(dev,
> >> DMA_BIT_MASK(32));
> >> + if (ret) {
> >> + dev_warn(dev, "Failed to set dma mask
> >> %d\n", ret);
> >> + return ret;
> >> + }
> >> + }
> >> +
> >> + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
> >> + if (!priv)
> >> + return -ENOMEM;
> >> +
> >> + mipi_dsi_set_drvdata(dsi, priv);
> >> + priv->dsi = dsi;
> >> +
> >> + device_property_read_u32(dev, "rotation", &priv->rotation);
> >> +
> >> + priv->pdata = device_get_match_data(dev);
> >> + if (!priv->pdata)
> >> + return -EINVAL;
> >> +
> >> + drm_panel_init(&priv->panel, dev, &ili9341_funcs,
> >> + DRM_MODE_CONNECTOR_DPI);
> >> +
> >> + priv->reset_gpiod = devm_gpiod_get(dev, "reset",
> >> GPIOD_OUT_HIGH);
> >> + if (IS_ERR(priv->reset_gpiod)) {
> >> + dev_err(dev, "Couldn't get our reset GPIO\n");
> >> + return PTR_ERR(priv->reset_gpiod);
> >> + }
> >> +
> >> + ret = drm_panel_of_backlight(&priv->panel);
> >> + if (ret < 0) {
> >> + if (ret != -EPROBE_DEFER)
> >> + dev_err(dev, "Failed to get backlight
> >> handle\n");
> >> + return ret;
> >> + }
> >> +
> >> + drm_panel_add(&priv->panel);
> >> +
> >> + dsi->bus_type = priv->pdata->bus_type;
> >> + dsi->lanes = priv->pdata->lanes;
> >> + dsi->format = MIPI_DSI_FMT_RGB565;
> >> +
> >> + ret = mipi_dsi_attach(dsi);
> >> + if (ret) {
> >> + dev_err(dev, "Failed to attach DSI panel\n");
> >> + goto err_panel_remove;
> >> + }
> >> +
> >> + ret = mipi_dsi_maybe_register_tiny_driver(dsi);
> >> + if (ret) {
> >> + dev_err(dev, "Failed to init TinyDRM driver\n");
> >> + goto err_mipi_dsi_detach;
> >> + }
> >> +
> >> + return 0;
> >> +
> >> +err_mipi_dsi_detach:
> >> + mipi_dsi_detach(dsi);
> >> +err_panel_remove:
> >> + drm_panel_remove(&priv->panel);
> >> + return ret;
> >> +}
> >> +
> >> +static int ili9341_remove(struct mipi_dsi_device *dsi)
> >> +{
> >> + struct ili9341 *priv = mipi_dsi_get_drvdata(dsi);
> >> +
> >> + mipi_dsi_detach(dsi);
> >> + drm_panel_remove(&priv->panel);
> >> +
> >> + drm_panel_disable(&priv->panel);
> >> + drm_panel_unprepare(&priv->panel);
> >> +
> >> + return 0;
> >> +}
> >> +
> >> +static const struct ili9341_pdata yx240qv29_pdata = {
> >> + .mode = { DRM_SIMPLE_MODE(240, 320, 37, 49) },
> >> + .width_mm = 0, // TODO
> >> + .height_mm = 0, // TODO
> >> + .bus_type = MIPI_DCS_BUS_TYPE_DBI_SPI_C3,
> >> + .lanes = 1,
> >> +};
> >> +
> >> +static const struct of_device_id ili9341_of_match[] = {
> >> + { .compatible = "adafruit,yx240qv29", .data =
> >> &yx240qv29_pdata },
> >> + { }
> >> +};
> >> +MODULE_DEVICE_TABLE(of, ili9341_of_match);
> >> +
> >> +static struct mipi_dsi_driver ili9341_dsi_driver = {
> >> + .probe = ili9341_probe,
> >> + .remove = ili9341_remove,
> >> + .driver = {
> >> + .name = "ili9341-dsi",
> >> + .of_match_table = ili9341_of_match,
> >> + },
> >> +};
> >> +module_mipi_dsi_driver(ili9341_dsi_driver);
> >
> > Again, you treat this driver as a mipi dsi driver but for a MIPI-DBI
> > (I8080/SPI)
> > panel device. That will make developers confused.
> >
> > Is it possible to just add a mipi_dbi_driver for I8080/SPI interface
> > panel?
> > Thanks!
>
> Please read the cover letter, it explains why it's done this way. The
> whole point of this patchset is to merge DSI and DBI frameworks in a
> way that can be maintained.
I think this proves the point that the proposed naming is confusing. At
least a rename would be required.
--
Regards,
Laurent Pinchart