0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/gpio/consumer.h>
0010 #include <linux/module.h>
0011 #include <linux/of_device.h>
0012 #include <linux/of_graph.h>
0013 #include <linux/regulator/consumer.h>
0014
0015 #include <drm/drm_atomic_helper.h>
0016 #include <drm/drm_bridge.h>
0017 #include <drm/drm_crtc.h>
0018 #include <drm/drm_edid.h>
0019 #include <drm/drm_print.h>
0020 #include <drm/drm_probe_helper.h>
0021
0022 struct simple_bridge_info {
0023 const struct drm_bridge_timings *timings;
0024 unsigned int connector_type;
0025 };
0026
0027 struct simple_bridge {
0028 struct drm_bridge bridge;
0029 struct drm_connector connector;
0030
0031 const struct simple_bridge_info *info;
0032
0033 struct drm_bridge *next_bridge;
0034 struct regulator *vdd;
0035 struct gpio_desc *enable;
0036 };
0037
0038 static inline struct simple_bridge *
0039 drm_bridge_to_simple_bridge(struct drm_bridge *bridge)
0040 {
0041 return container_of(bridge, struct simple_bridge, bridge);
0042 }
0043
0044 static inline struct simple_bridge *
0045 drm_connector_to_simple_bridge(struct drm_connector *connector)
0046 {
0047 return container_of(connector, struct simple_bridge, connector);
0048 }
0049
0050 static int simple_bridge_get_modes(struct drm_connector *connector)
0051 {
0052 struct simple_bridge *sbridge = drm_connector_to_simple_bridge(connector);
0053 struct edid *edid;
0054 int ret;
0055
0056 if (sbridge->next_bridge->ops & DRM_BRIDGE_OP_EDID) {
0057 edid = drm_bridge_get_edid(sbridge->next_bridge, connector);
0058 if (!edid)
0059 DRM_INFO("EDID read failed. Fallback to standard modes\n");
0060 } else {
0061 edid = NULL;
0062 }
0063
0064 if (!edid) {
0065
0066
0067
0068
0069
0070 ret = drm_add_modes_noedid(connector, 1920, 1200);
0071 drm_set_preferred_mode(connector, 1024, 768);
0072 return ret;
0073 }
0074
0075 drm_connector_update_edid_property(connector, edid);
0076 ret = drm_add_edid_modes(connector, edid);
0077 kfree(edid);
0078
0079 return ret;
0080 }
0081
0082 static const struct drm_connector_helper_funcs simple_bridge_con_helper_funcs = {
0083 .get_modes = simple_bridge_get_modes,
0084 };
0085
0086 static enum drm_connector_status
0087 simple_bridge_connector_detect(struct drm_connector *connector, bool force)
0088 {
0089 struct simple_bridge *sbridge = drm_connector_to_simple_bridge(connector);
0090
0091 return drm_bridge_detect(sbridge->next_bridge);
0092 }
0093
0094 static const struct drm_connector_funcs simple_bridge_con_funcs = {
0095 .detect = simple_bridge_connector_detect,
0096 .fill_modes = drm_helper_probe_single_connector_modes,
0097 .destroy = drm_connector_cleanup,
0098 .reset = drm_atomic_helper_connector_reset,
0099 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
0100 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
0101 };
0102
0103 static int simple_bridge_attach(struct drm_bridge *bridge,
0104 enum drm_bridge_attach_flags flags)
0105 {
0106 struct simple_bridge *sbridge = drm_bridge_to_simple_bridge(bridge);
0107 int ret;
0108
0109 ret = drm_bridge_attach(bridge->encoder, sbridge->next_bridge, bridge,
0110 DRM_BRIDGE_ATTACH_NO_CONNECTOR);
0111 if (ret < 0)
0112 return ret;
0113
0114 if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)
0115 return 0;
0116
0117 if (!bridge->encoder) {
0118 DRM_ERROR("Missing encoder\n");
0119 return -ENODEV;
0120 }
0121
0122 drm_connector_helper_add(&sbridge->connector,
0123 &simple_bridge_con_helper_funcs);
0124 ret = drm_connector_init_with_ddc(bridge->dev, &sbridge->connector,
0125 &simple_bridge_con_funcs,
0126 sbridge->info->connector_type,
0127 sbridge->next_bridge->ddc);
0128 if (ret) {
0129 DRM_ERROR("Failed to initialize connector\n");
0130 return ret;
0131 }
0132
0133 drm_connector_attach_encoder(&sbridge->connector, bridge->encoder);
0134
0135 return 0;
0136 }
0137
0138 static void simple_bridge_enable(struct drm_bridge *bridge)
0139 {
0140 struct simple_bridge *sbridge = drm_bridge_to_simple_bridge(bridge);
0141 int ret;
0142
0143 if (sbridge->vdd) {
0144 ret = regulator_enable(sbridge->vdd);
0145 if (ret)
0146 DRM_ERROR("Failed to enable vdd regulator: %d\n", ret);
0147 }
0148
0149 gpiod_set_value_cansleep(sbridge->enable, 1);
0150 }
0151
0152 static void simple_bridge_disable(struct drm_bridge *bridge)
0153 {
0154 struct simple_bridge *sbridge = drm_bridge_to_simple_bridge(bridge);
0155
0156 gpiod_set_value_cansleep(sbridge->enable, 0);
0157
0158 if (sbridge->vdd)
0159 regulator_disable(sbridge->vdd);
0160 }
0161
0162 static const struct drm_bridge_funcs simple_bridge_bridge_funcs = {
0163 .attach = simple_bridge_attach,
0164 .enable = simple_bridge_enable,
0165 .disable = simple_bridge_disable,
0166 };
0167
0168 static int simple_bridge_probe(struct platform_device *pdev)
0169 {
0170 struct simple_bridge *sbridge;
0171 struct device_node *remote;
0172
0173 sbridge = devm_kzalloc(&pdev->dev, sizeof(*sbridge), GFP_KERNEL);
0174 if (!sbridge)
0175 return -ENOMEM;
0176 platform_set_drvdata(pdev, sbridge);
0177
0178 sbridge->info = of_device_get_match_data(&pdev->dev);
0179
0180
0181 remote = of_graph_get_remote_node(pdev->dev.of_node, 1, -1);
0182 if (!remote)
0183 return -EINVAL;
0184
0185 sbridge->next_bridge = of_drm_find_bridge(remote);
0186 of_node_put(remote);
0187
0188 if (!sbridge->next_bridge) {
0189 dev_dbg(&pdev->dev, "Next bridge not found, deferring probe\n");
0190 return -EPROBE_DEFER;
0191 }
0192
0193
0194 sbridge->vdd = devm_regulator_get_optional(&pdev->dev, "vdd");
0195 if (IS_ERR(sbridge->vdd)) {
0196 int ret = PTR_ERR(sbridge->vdd);
0197 if (ret == -EPROBE_DEFER)
0198 return -EPROBE_DEFER;
0199 sbridge->vdd = NULL;
0200 dev_dbg(&pdev->dev, "No vdd regulator found: %d\n", ret);
0201 }
0202
0203 sbridge->enable = devm_gpiod_get_optional(&pdev->dev, "enable",
0204 GPIOD_OUT_LOW);
0205 if (IS_ERR(sbridge->enable)) {
0206 if (PTR_ERR(sbridge->enable) != -EPROBE_DEFER)
0207 dev_err(&pdev->dev, "Unable to retrieve enable GPIO\n");
0208 return PTR_ERR(sbridge->enable);
0209 }
0210
0211
0212 sbridge->bridge.funcs = &simple_bridge_bridge_funcs;
0213 sbridge->bridge.of_node = pdev->dev.of_node;
0214 sbridge->bridge.timings = sbridge->info->timings;
0215
0216 drm_bridge_add(&sbridge->bridge);
0217
0218 return 0;
0219 }
0220
0221 static int simple_bridge_remove(struct platform_device *pdev)
0222 {
0223 struct simple_bridge *sbridge = platform_get_drvdata(pdev);
0224
0225 drm_bridge_remove(&sbridge->bridge);
0226
0227 return 0;
0228 }
0229
0230
0231
0232
0233
0234
0235
0236 static const struct drm_bridge_timings default_bridge_timings = {
0237
0238 .input_bus_flags = DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE,
0239 .setup_time_ps = 500,
0240 .hold_time_ps = 1500,
0241 };
0242
0243
0244
0245
0246
0247 static const struct drm_bridge_timings ti_ths8134_bridge_timings = {
0248
0249 .input_bus_flags = DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE,
0250
0251 .setup_time_ps = 3000,
0252
0253 .hold_time_ps = 0,
0254 };
0255
0256
0257
0258
0259
0260 static const struct drm_bridge_timings ti_ths8135_bridge_timings = {
0261
0262 .input_bus_flags = DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE,
0263
0264 .setup_time_ps = 2000,
0265 .hold_time_ps = 500,
0266 };
0267
0268 static const struct of_device_id simple_bridge_match[] = {
0269 {
0270 .compatible = "dumb-vga-dac",
0271 .data = &(const struct simple_bridge_info) {
0272 .connector_type = DRM_MODE_CONNECTOR_VGA,
0273 },
0274 }, {
0275 .compatible = "adi,adv7123",
0276 .data = &(const struct simple_bridge_info) {
0277 .timings = &default_bridge_timings,
0278 .connector_type = DRM_MODE_CONNECTOR_VGA,
0279 },
0280 }, {
0281 .compatible = "ti,opa362",
0282 .data = &(const struct simple_bridge_info) {
0283 .connector_type = DRM_MODE_CONNECTOR_Composite,
0284 },
0285 }, {
0286 .compatible = "ti,ths8135",
0287 .data = &(const struct simple_bridge_info) {
0288 .timings = &ti_ths8135_bridge_timings,
0289 .connector_type = DRM_MODE_CONNECTOR_VGA,
0290 },
0291 }, {
0292 .compatible = "ti,ths8134",
0293 .data = &(const struct simple_bridge_info) {
0294 .timings = &ti_ths8134_bridge_timings,
0295 .connector_type = DRM_MODE_CONNECTOR_VGA,
0296 },
0297 },
0298 {},
0299 };
0300 MODULE_DEVICE_TABLE(of, simple_bridge_match);
0301
0302 static struct platform_driver simple_bridge_driver = {
0303 .probe = simple_bridge_probe,
0304 .remove = simple_bridge_remove,
0305 .driver = {
0306 .name = "simple-bridge",
0307 .of_match_table = simple_bridge_match,
0308 },
0309 };
0310 module_platform_driver(simple_bridge_driver);
0311
0312 MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>");
0313 MODULE_DESCRIPTION("Simple DRM bridge driver");
0314 MODULE_LICENSE("GPL");