#include <drm/drm_simple_kms_helper.h>
#include <linux/clk.h>
#include <linux/component.h>
+#include <linux/extcon-provider.h>
#include <linux/i2c.h>
#include <linux/of_address.h>
#include <linux/of_gpio.h>
{
struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector);
bool connected = false;
+ enum drm_connector_status status;
if (vc4_hdmi->hpd_gpio) {
if (gpio_get_value_cansleep(vc4_hdmi->hpd_gpio) ^
}
}
- return connector_status_connected;
+ status = connector_status_connected;
+ goto out;
}
cec_phys_addr_invalidate(vc4_hdmi->cec_adap);
- return connector_status_disconnected;
+ status = connector_status_disconnected;
+
+out:
+#ifdef CONFIG_EXTCON
+ if (status != vc4_hdmi->status) {
+ extcon_set_state_sync(vc4_hdmi->edev, EXTCON_DISP_HDMI,
+ (status == connector_status_connected ?
+ true : false));
+ vc4_hdmi->status = status;
+ }
+#endif
+ return status;
}
static void vc4_hdmi_connector_destroy(struct drm_connector *connector)
return 0;
}
+#ifdef CONFIG_EXTCON
+static const unsigned int vc4_hdmi_extcon_cable[] = {
+ EXTCON_DISP_HDMI,
+ EXTCON_NONE,
+};
+#endif
+
static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data)
{
const struct vc4_hdmi_variant *variant = of_device_get_match_data(dev);
return -EPROBE_DEFER;
}
+#ifdef CONFIG_EXTCON
+ vc4_hdmi->status = connector_status_disconnected;
+
+ /* Initialize extcon device */
+ vc4_hdmi->edev = devm_extcon_dev_allocate(dev, vc4_hdmi_extcon_cable);
+ if (IS_ERR(vc4_hdmi->edev)) {
+ dev_err(dev, "failed to allocate memory for extcon\n");
+ return PTR_ERR(vc4_hdmi->edev);
+ }
+
+ ret = devm_extcon_dev_register(dev, vc4_hdmi->edev);
+ if (ret) {
+ dev_err(dev, "failed to register extcon device\n");
+ return ret;
+ }
+#endif
+
/* Only use the GPIO HPD pin if present in the DT, otherwise
* we'll use the HDMI core's register.
*/
struct vc4_hdmi_register;
struct vc4_hdmi_connector_state;
+#ifdef CONFIG_EXTCON
+struct extcon_dev;
+#endif
+
enum vc4_hdmi_phy_channel {
PHY_LANE_0 = 0,
PHY_LANE_1,
struct debugfs_regset32 phy_regset;
struct debugfs_regset32 ram_regset;
struct debugfs_regset32 rm_regset;
+
+#ifdef CONFIG_EXTCON
+ enum drm_connector_status status;
+ struct extcon_dev *edev;
+#endif
};
static inline struct vc4_hdmi *