Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
0004  */
0005 
0006 #define pr_fmt(fmt) "[drm-dp] %s: " fmt, __func__
0007 
0008 #include <linux/slab.h>
0009 #include <linux/device.h>
0010 
0011 #include "dp_hpd.h"
0012 
0013 /* DP specific VDM commands */
0014 #define DP_USBPD_VDM_STATUS 0x10
0015 #define DP_USBPD_VDM_CONFIGURE  0x11
0016 
0017 /* USBPD-TypeC specific Macros */
0018 #define VDM_VERSION     0x0
0019 #define USB_C_DP_SID        0xFF01
0020 
0021 struct dp_hpd_private {
0022     struct device *dev;
0023     struct dp_usbpd_cb *dp_cb;
0024     struct dp_usbpd dp_usbpd;
0025 };
0026 
0027 int dp_hpd_connect(struct dp_usbpd *dp_usbpd, bool hpd)
0028 {
0029     int rc = 0;
0030     struct dp_hpd_private *hpd_priv;
0031 
0032     hpd_priv = container_of(dp_usbpd, struct dp_hpd_private,
0033                     dp_usbpd);
0034 
0035     if (!hpd_priv->dp_cb || !hpd_priv->dp_cb->configure
0036                 || !hpd_priv->dp_cb->disconnect) {
0037         pr_err("hpd dp_cb not initialized\n");
0038         return -EINVAL;
0039     }
0040     if (hpd)
0041         hpd_priv->dp_cb->configure(hpd_priv->dev);
0042     else
0043         hpd_priv->dp_cb->disconnect(hpd_priv->dev);
0044 
0045     return rc;
0046 }
0047 
0048 struct dp_usbpd *dp_hpd_get(struct device *dev, struct dp_usbpd_cb *cb)
0049 {
0050     struct dp_hpd_private *dp_hpd;
0051 
0052     if (!cb) {
0053         pr_err("invalid cb data\n");
0054         return ERR_PTR(-EINVAL);
0055     }
0056 
0057     dp_hpd = devm_kzalloc(dev, sizeof(*dp_hpd), GFP_KERNEL);
0058     if (!dp_hpd)
0059         return ERR_PTR(-ENOMEM);
0060 
0061     dp_hpd->dev = dev;
0062     dp_hpd->dp_cb = cb;
0063 
0064     dp_hpd->dp_usbpd.connect = dp_hpd_connect;
0065 
0066     return &dp_hpd->dp_usbpd;
0067 }