Hi Jyri, Thank you for the patch. On Wed, Dec 04, 2019 at 07:53:10PM +0200, Jyri Sarha wrote: > Remove obsolete bundled tfp410 driver with its "ti,tilcdc,tfp410" > devicetree binding. No platform has ever used this driver in the > mainline kernel and if anybody connects tfp410 to tilcdc he or she > should use the generic drm tfp410 bridge driver. > > Signed-off-by: Jyri Sarha <jsarha@xxxxxx> Reviewed-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> > --- > .../bindings/display/tilcdc/tfp410.txt | 21 - > drivers/gpu/drm/tilcdc/Makefile | 1 - > drivers/gpu/drm/tilcdc/tilcdc_drv.c | 3 - > drivers/gpu/drm/tilcdc/tilcdc_tfp410.c | 379 ------------------ > drivers/gpu/drm/tilcdc/tilcdc_tfp410.h | 15 - > 5 files changed, 419 deletions(-) > delete mode 100644 Documentation/devicetree/bindings/display/tilcdc/tfp410.txt > delete mode 100644 drivers/gpu/drm/tilcdc/tilcdc_tfp410.c > delete mode 100644 drivers/gpu/drm/tilcdc/tilcdc_tfp410.h > > diff --git a/Documentation/devicetree/bindings/display/tilcdc/tfp410.txt b/Documentation/devicetree/bindings/display/tilcdc/tfp410.txt > deleted file mode 100644 > index a58ae7756fc6..000000000000 > --- a/Documentation/devicetree/bindings/display/tilcdc/tfp410.txt > +++ /dev/null > @@ -1,21 +0,0 @@ > -Device-Tree bindings for tilcdc DRM TFP410 output driver > - > -Required properties: > - - compatible: value should be "ti,tilcdc,tfp410". > - - i2c: the phandle for the i2c device to use for DDC > - > -Recommended properties: > - - pinctrl-names, pinctrl-0: the pincontrol settings to configure > - muxing properly for pins that connect to TFP410 device > - - powerdn-gpio: the powerdown GPIO, pulled low to power down the > - TFP410 device (for DPMS_OFF) > - > -Example: > - > - dvicape { > - compatible = "ti,tilcdc,tfp410"; > - i2c = <&i2c2>; > - pinctrl-names = "default"; > - pinctrl-0 = <&bone_dvi_cape_dvi_00A1_pins>; > - powerdn-gpio = <&gpio2 31 0>; > - }; > diff --git a/drivers/gpu/drm/tilcdc/Makefile b/drivers/gpu/drm/tilcdc/Makefile > index 87f9480e43b0..662bf3a348c9 100644 > --- a/drivers/gpu/drm/tilcdc/Makefile > +++ b/drivers/gpu/drm/tilcdc/Makefile > @@ -6,7 +6,6 @@ endif > tilcdc-y := \ > tilcdc_plane.o \ > tilcdc_crtc.o \ > - tilcdc_tfp410.o \ > tilcdc_panel.o \ > tilcdc_external.o \ > tilcdc_drv.o > diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.c b/drivers/gpu/drm/tilcdc/tilcdc_drv.c > index 2a9e67597375..20745db863ff 100644 > --- a/drivers/gpu/drm/tilcdc/tilcdc_drv.c > +++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.c > @@ -30,7 +30,6 @@ > #include "tilcdc_external.h" > #include "tilcdc_panel.h" > #include "tilcdc_regs.h" > -#include "tilcdc_tfp410.h" > > static LIST_HEAD(module_list); > > @@ -649,7 +648,6 @@ static struct platform_driver tilcdc_platform_driver = { > static int __init tilcdc_drm_init(void) > { > DBG("init"); > - tilcdc_tfp410_init(); > tilcdc_panel_init(); > return platform_driver_register(&tilcdc_platform_driver); > } > @@ -659,7 +657,6 @@ static void __exit tilcdc_drm_fini(void) > DBG("fini"); > platform_driver_unregister(&tilcdc_platform_driver); > tilcdc_panel_fini(); > - tilcdc_tfp410_fini(); > } > > module_init(tilcdc_drm_init); > diff --git a/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c b/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c > deleted file mode 100644 > index 530edb3b51cc..000000000000 > --- a/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c > +++ /dev/null > @@ -1,379 +0,0 @@ > -// SPDX-License-Identifier: GPL-2.0-only > -/* > - * Copyright (C) 2012 Texas Instruments > - * Author: Rob Clark <robdclark@xxxxxxxxx> > - */ > - > -#include <linux/gpio.h> > -#include <linux/mod_devicetable.h> > -#include <linux/of_gpio.h> > -#include <linux/pinctrl/consumer.h> > -#include <linux/platform_device.h> > - > -#include <drm/drm_atomic_helper.h> > -#include <drm/drm_encoder.h> > -#include <drm/drm_modeset_helper_vtables.h> > -#include <drm/drm_probe_helper.h> > - > -#include "tilcdc_drv.h" > -#include "tilcdc_tfp410.h" > - > -struct tfp410_module { > - struct tilcdc_module base; > - struct i2c_adapter *i2c; > - int gpio; > -}; > -#define to_tfp410_module(x) container_of(x, struct tfp410_module, base) > - > - > -static const struct tilcdc_panel_info dvi_info = { > - .ac_bias = 255, > - .ac_bias_intrpt = 0, > - .dma_burst_sz = 16, > - .bpp = 16, > - .fdd = 0x80, > - .tft_alt_mode = 0, > - .sync_edge = 0, > - .sync_ctrl = 1, > - .raster_order = 0, > -}; > - > -/* > - * Encoder: > - */ > - > -struct tfp410_encoder { > - struct drm_encoder base; > - struct tfp410_module *mod; > - int dpms; > -}; > -#define to_tfp410_encoder(x) container_of(x, struct tfp410_encoder, base) > - > -static void tfp410_encoder_dpms(struct drm_encoder *encoder, int mode) > -{ > - struct tfp410_encoder *tfp410_encoder = to_tfp410_encoder(encoder); > - > - if (tfp410_encoder->dpms == mode) > - return; > - > - if (mode == DRM_MODE_DPMS_ON) { > - DBG("Power on"); > - gpio_direction_output(tfp410_encoder->mod->gpio, 1); > - } else { > - DBG("Power off"); > - gpio_direction_output(tfp410_encoder->mod->gpio, 0); > - } > - > - tfp410_encoder->dpms = mode; > -} > - > -static void tfp410_encoder_prepare(struct drm_encoder *encoder) > -{ > - tfp410_encoder_dpms(encoder, DRM_MODE_DPMS_OFF); > -} > - > -static void tfp410_encoder_commit(struct drm_encoder *encoder) > -{ > - tfp410_encoder_dpms(encoder, DRM_MODE_DPMS_ON); > -} > - > -static void tfp410_encoder_mode_set(struct drm_encoder *encoder, > - struct drm_display_mode *mode, > - struct drm_display_mode *adjusted_mode) > -{ > - /* nothing needed */ > -} > - > -static const struct drm_encoder_funcs tfp410_encoder_funcs = { > - .destroy = drm_encoder_cleanup, > -}; > - > -static const struct drm_encoder_helper_funcs tfp410_encoder_helper_funcs = { > - .dpms = tfp410_encoder_dpms, > - .prepare = tfp410_encoder_prepare, > - .commit = tfp410_encoder_commit, > - .mode_set = tfp410_encoder_mode_set, > -}; > - > -static struct drm_encoder *tfp410_encoder_create(struct drm_device *dev, > - struct tfp410_module *mod) > -{ > - struct tfp410_encoder *tfp410_encoder; > - struct drm_encoder *encoder; > - int ret; > - > - tfp410_encoder = devm_kzalloc(dev->dev, sizeof(*tfp410_encoder), > - GFP_KERNEL); > - if (!tfp410_encoder) > - return NULL; > - > - tfp410_encoder->dpms = DRM_MODE_DPMS_OFF; > - tfp410_encoder->mod = mod; > - > - encoder = &tfp410_encoder->base; > - encoder->possible_crtcs = 1; > - > - ret = drm_encoder_init(dev, encoder, &tfp410_encoder_funcs, > - DRM_MODE_ENCODER_TMDS, NULL); > - if (ret < 0) > - goto fail; > - > - drm_encoder_helper_add(encoder, &tfp410_encoder_helper_funcs); > - > - return encoder; > - > -fail: > - drm_encoder_cleanup(encoder); > - return NULL; > -} > - > -/* > - * Connector: > - */ > - > -struct tfp410_connector { > - struct drm_connector base; > - > - struct drm_encoder *encoder; /* our connected encoder */ > - struct tfp410_module *mod; > -}; > -#define to_tfp410_connector(x) container_of(x, struct tfp410_connector, base) > - > - > -static void tfp410_connector_destroy(struct drm_connector *connector) > -{ > - drm_connector_unregister(connector); > - drm_connector_cleanup(connector); > -} > - > -static enum drm_connector_status tfp410_connector_detect( > - struct drm_connector *connector, > - bool force) > -{ > - struct tfp410_connector *tfp410_connector = to_tfp410_connector(connector); > - > - if (drm_probe_ddc(tfp410_connector->mod->i2c)) > - return connector_status_connected; > - > - return connector_status_unknown; > -} > - > -static int tfp410_connector_get_modes(struct drm_connector *connector) > -{ > - struct tfp410_connector *tfp410_connector = to_tfp410_connector(connector); > - struct edid *edid; > - int ret = 0; > - > - edid = drm_get_edid(connector, tfp410_connector->mod->i2c); > - > - drm_connector_update_edid_property(connector, edid); > - > - if (edid) { > - ret = drm_add_edid_modes(connector, edid); > - kfree(edid); > - } > - > - return ret; > -} > - > -static struct drm_encoder *tfp410_connector_best_encoder( > - struct drm_connector *connector) > -{ > - struct tfp410_connector *tfp410_connector = to_tfp410_connector(connector); > - return tfp410_connector->encoder; > -} > - > -static const struct drm_connector_funcs tfp410_connector_funcs = { > - .destroy = tfp410_connector_destroy, > - .detect = tfp410_connector_detect, > - .fill_modes = drm_helper_probe_single_connector_modes, > - .reset = drm_atomic_helper_connector_reset, > - .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, > - .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, > -}; > - > -static const struct drm_connector_helper_funcs tfp410_connector_helper_funcs = { > - .get_modes = tfp410_connector_get_modes, > - .best_encoder = tfp410_connector_best_encoder, > -}; > - > -static struct drm_connector *tfp410_connector_create(struct drm_device *dev, > - struct tfp410_module *mod, struct drm_encoder *encoder) > -{ > - struct tfp410_connector *tfp410_connector; > - struct drm_connector *connector; > - int ret; > - > - tfp410_connector = devm_kzalloc(dev->dev, sizeof(*tfp410_connector), > - GFP_KERNEL); > - if (!tfp410_connector) > - return NULL; > - > - tfp410_connector->encoder = encoder; > - tfp410_connector->mod = mod; > - > - connector = &tfp410_connector->base; > - > - drm_connector_init(dev, connector, &tfp410_connector_funcs, > - DRM_MODE_CONNECTOR_DVID); > - drm_connector_helper_add(connector, &tfp410_connector_helper_funcs); > - > - connector->polled = DRM_CONNECTOR_POLL_CONNECT | > - DRM_CONNECTOR_POLL_DISCONNECT; > - > - connector->interlace_allowed = 0; > - connector->doublescan_allowed = 0; > - > - ret = drm_connector_attach_encoder(connector, encoder); > - if (ret) > - goto fail; > - > - return connector; > - > -fail: > - tfp410_connector_destroy(connector); > - return NULL; > -} > - > -/* > - * Module: > - */ > - > -static int tfp410_modeset_init(struct tilcdc_module *mod, struct drm_device *dev) > -{ > - struct tfp410_module *tfp410_mod = to_tfp410_module(mod); > - struct tilcdc_drm_private *priv = dev->dev_private; > - struct drm_encoder *encoder; > - struct drm_connector *connector; > - > - encoder = tfp410_encoder_create(dev, tfp410_mod); > - if (!encoder) > - return -ENOMEM; > - > - connector = tfp410_connector_create(dev, tfp410_mod, encoder); > - if (!connector) > - return -ENOMEM; > - > - priv->encoders[priv->num_encoders++] = encoder; > - priv->connectors[priv->num_connectors++] = connector; > - > - tilcdc_crtc_set_panel_info(priv->crtc, &dvi_info); > - return 0; > -} > - > -static const struct tilcdc_module_ops tfp410_module_ops = { > - .modeset_init = tfp410_modeset_init, > -}; > - > -/* > - * Device: > - */ > - > -static int tfp410_probe(struct platform_device *pdev) > -{ > - struct device_node *node = pdev->dev.of_node; > - struct device_node *i2c_node; > - struct tfp410_module *tfp410_mod; > - struct tilcdc_module *mod; > - struct pinctrl *pinctrl; > - uint32_t i2c_phandle; > - int ret = -EINVAL; > - > - /* bail out early if no DT data: */ > - if (!node) { > - dev_err(&pdev->dev, "device-tree data is missing\n"); > - return -ENXIO; > - } > - > - tfp410_mod = devm_kzalloc(&pdev->dev, sizeof(*tfp410_mod), GFP_KERNEL); > - if (!tfp410_mod) > - return -ENOMEM; > - > - mod = &tfp410_mod->base; > - pdev->dev.platform_data = mod; > - > - tilcdc_module_init(mod, "tfp410", &tfp410_module_ops); > - > - pinctrl = devm_pinctrl_get_select_default(&pdev->dev); > - if (IS_ERR(pinctrl)) > - dev_warn(&pdev->dev, "pins are not configured\n"); > - > - if (of_property_read_u32(node, "i2c", &i2c_phandle)) { > - dev_err(&pdev->dev, "could not get i2c bus phandle\n"); > - goto fail; > - } > - > - i2c_node = of_find_node_by_phandle(i2c_phandle); > - if (!i2c_node) { > - dev_err(&pdev->dev, "could not get i2c bus node\n"); > - goto fail; > - } > - > - tfp410_mod->i2c = of_find_i2c_adapter_by_node(i2c_node); > - if (!tfp410_mod->i2c) { > - dev_err(&pdev->dev, "could not get i2c\n"); > - of_node_put(i2c_node); > - goto fail; > - } > - > - of_node_put(i2c_node); > - > - tfp410_mod->gpio = of_get_named_gpio_flags(node, "powerdn-gpio", > - 0, NULL); > - if (tfp410_mod->gpio < 0) { > - dev_warn(&pdev->dev, "No power down GPIO\n"); > - } else { > - ret = gpio_request(tfp410_mod->gpio, "DVI_PDn"); > - if (ret) { > - dev_err(&pdev->dev, "could not get DVI_PDn gpio\n"); > - goto fail_adapter; > - } > - } > - > - return 0; > - > -fail_adapter: > - i2c_put_adapter(tfp410_mod->i2c); > - > -fail: > - tilcdc_module_cleanup(mod); > - return ret; > -} > - > -static int tfp410_remove(struct platform_device *pdev) > -{ > - struct tilcdc_module *mod = dev_get_platdata(&pdev->dev); > - struct tfp410_module *tfp410_mod = to_tfp410_module(mod); > - > - i2c_put_adapter(tfp410_mod->i2c); > - gpio_free(tfp410_mod->gpio); > - > - tilcdc_module_cleanup(mod); > - > - return 0; > -} > - > -static const struct of_device_id tfp410_of_match[] = { > - { .compatible = "ti,tilcdc,tfp410", }, > - { }, > -}; > - > -struct platform_driver tfp410_driver = { > - .probe = tfp410_probe, > - .remove = tfp410_remove, > - .driver = { > - .owner = THIS_MODULE, > - .name = "tfp410", > - .of_match_table = tfp410_of_match, > - }, > -}; > - > -int __init tilcdc_tfp410_init(void) > -{ > - return platform_driver_register(&tfp410_driver); > -} > - > -void __exit tilcdc_tfp410_fini(void) > -{ > - platform_driver_unregister(&tfp410_driver); > -} > diff --git a/drivers/gpu/drm/tilcdc/tilcdc_tfp410.h b/drivers/gpu/drm/tilcdc/tilcdc_tfp410.h > deleted file mode 100644 > index f9aaf6911ffc..000000000000 > --- a/drivers/gpu/drm/tilcdc/tilcdc_tfp410.h > +++ /dev/null > @@ -1,15 +0,0 @@ > -/* SPDX-License-Identifier: GPL-2.0-only */ > -/* > - * Copyright (C) 2012 Texas Instruments > - * Author: Rob Clark <robdclark@xxxxxxxxx> > - */ > - > -#ifndef __TILCDC_TFP410_H__ > -#define __TILCDC_TFP410_H__ > - > -/* sub-module for tfp410 dvi adaptor */ > - > -int tilcdc_tfp410_init(void); > -void tilcdc_tfp410_fini(void); > - > -#endif /* __TILCDC_TFP410_H__ */ -- Regards, Laurent Pinchart