Commit 68e674b1 authored by Dmitry Baryshkov's avatar Dmitry Baryshkov

drm/msm/hdmi: drop unused GPIO support

The HDMI driver has code to configure extra GPIOs, which predates
pinctrl support. Nowadays all platforms should use pinctrl instead.
Neither of upstreamed Qualcomm platforms uses these properties, so it's
safe to drop them.
Reported-by: default avatarkernel test robot <lkp@intel.com>
Signed-off-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: default avatarStephen Boyd <swboyd@chromium.org>
Patchwork: https://patchwork.freedesktop.org/patch/488858/
Link: https://lore.kernel.org/r/20220609122350.3157529-7-dmitry.baryshkov@linaro.orgSigned-off-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
parent 7fbf0253
...@@ -233,6 +233,20 @@ static struct hdmi *msm_hdmi_init(struct platform_device *pdev) ...@@ -233,6 +233,20 @@ static struct hdmi *msm_hdmi_init(struct platform_device *pdev)
hdmi->pwr_clks[i] = clk; hdmi->pwr_clks[i] = clk;
} }
hdmi->hpd_gpiod = devm_gpiod_get_optional(&pdev->dev, "hpd", GPIOD_IN);
/* This will catch e.g. -EPROBE_DEFER */
if (IS_ERR(hdmi->hpd_gpiod)) {
ret = PTR_ERR(hdmi->hpd_gpiod);
DRM_DEV_ERROR(&pdev->dev, "failed to get hpd gpio: (%d)\n", ret);
goto fail;
}
if (!hdmi->hpd_gpiod)
DBG("failed to get HPD gpio");
if (hdmi->hpd_gpiod)
gpiod_set_consumer_name(hdmi->hpd_gpiod, "HDMI_HPD");
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
hdmi->workq = alloc_ordered_workqueue("msm_hdmi", 0); hdmi->workq = alloc_ordered_workqueue("msm_hdmi", 0);
...@@ -409,20 +423,6 @@ static struct hdmi_platform_config hdmi_tx_8996_config = { ...@@ -409,20 +423,6 @@ static struct hdmi_platform_config hdmi_tx_8996_config = {
.hpd_freq = hpd_clk_freq_8x74, .hpd_freq = hpd_clk_freq_8x74,
}; };
static const struct {
const char *name;
const bool output;
const int value;
const char *label;
} msm_hdmi_gpio_pdata[] = {
{ "qcom,hdmi-tx-ddc-clk", true, 1, "HDMI_DDC_CLK" },
{ "qcom,hdmi-tx-ddc-data", true, 1, "HDMI_DDC_DATA" },
{ "qcom,hdmi-tx-hpd", false, 1, "HDMI_HPD" },
{ "qcom,hdmi-tx-mux-en", true, 1, "HDMI_MUX_EN" },
{ "qcom,hdmi-tx-mux-sel", true, 0, "HDMI_MUX_SEL" },
{ "qcom,hdmi-tx-mux-lpm", true, 1, "HDMI_MUX_LPM" },
};
/* /*
* HDMI audio codec callbacks * HDMI audio codec callbacks
*/ */
...@@ -534,7 +534,7 @@ static int msm_hdmi_bind(struct device *dev, struct device *master, void *data) ...@@ -534,7 +534,7 @@ static int msm_hdmi_bind(struct device *dev, struct device *master, void *data)
struct hdmi_platform_config *hdmi_cfg; struct hdmi_platform_config *hdmi_cfg;
struct hdmi *hdmi; struct hdmi *hdmi;
struct device_node *of_node = dev->of_node; struct device_node *of_node = dev->of_node;
int i, err; int err;
hdmi_cfg = (struct hdmi_platform_config *) hdmi_cfg = (struct hdmi_platform_config *)
of_device_get_match_data(dev); of_device_get_match_data(dev);
...@@ -546,42 +546,6 @@ static int msm_hdmi_bind(struct device *dev, struct device *master, void *data) ...@@ -546,42 +546,6 @@ static int msm_hdmi_bind(struct device *dev, struct device *master, void *data)
hdmi_cfg->mmio_name = "core_physical"; hdmi_cfg->mmio_name = "core_physical";
hdmi_cfg->qfprom_mmio_name = "qfprom_physical"; hdmi_cfg->qfprom_mmio_name = "qfprom_physical";
for (i = 0; i < HDMI_MAX_NUM_GPIO; i++) {
const char *name = msm_hdmi_gpio_pdata[i].name;
struct gpio_desc *gpiod;
/*
* We are fetching the GPIO lines "as is" since the connector
* code is enabling and disabling the lines. Until that point
* the power-on default value will be kept.
*/
gpiod = devm_gpiod_get_optional(dev, name, GPIOD_ASIS);
/* This will catch e.g. -PROBE_DEFER */
if (IS_ERR(gpiod))
return PTR_ERR(gpiod);
if (!gpiod) {
/* Try a second time, stripping down the name */
char name3[32];
/*
* Try again after stripping out the "qcom,hdmi-tx"
* prefix. This is mainly to match "hpd-gpios" used
* in the upstream bindings.
*/
if (sscanf(name, "qcom,hdmi-tx-%s", name3))
gpiod = devm_gpiod_get_optional(dev, name3, GPIOD_ASIS);
if (IS_ERR(gpiod))
return PTR_ERR(gpiod);
if (!gpiod)
DBG("failed to get gpio: %s", name);
}
hdmi_cfg->gpios[i].gpiod = gpiod;
if (gpiod)
gpiod_set_consumer_name(gpiod, msm_hdmi_gpio_pdata[i].label);
hdmi_cfg->gpios[i].output = msm_hdmi_gpio_pdata[i].output;
hdmi_cfg->gpios[i].value = msm_hdmi_gpio_pdata[i].value;
}
dev->platform_data = hdmi_cfg; dev->platform_data = hdmi_cfg;
hdmi = msm_hdmi_init(to_platform_device(dev)); hdmi = msm_hdmi_init(to_platform_device(dev));
......
...@@ -19,17 +19,9 @@ ...@@ -19,17 +19,9 @@
#include "msm_drv.h" #include "msm_drv.h"
#include "hdmi.xml.h" #include "hdmi.xml.h"
#define HDMI_MAX_NUM_GPIO 6
struct hdmi_phy; struct hdmi_phy;
struct hdmi_platform_config; struct hdmi_platform_config;
struct hdmi_gpio_data {
struct gpio_desc *gpiod;
bool output;
int value;
};
struct hdmi_audio { struct hdmi_audio {
bool enabled; bool enabled;
struct hdmi_audio_infoframe infoframe; struct hdmi_audio_infoframe infoframe;
...@@ -61,6 +53,8 @@ struct hdmi { ...@@ -61,6 +53,8 @@ struct hdmi {
struct clk **hpd_clks; struct clk **hpd_clks;
struct clk **pwr_clks; struct clk **pwr_clks;
struct gpio_desc *hpd_gpiod;
struct hdmi_phy *phy; struct hdmi_phy *phy;
struct device *phy_dev; struct device *phy_dev;
...@@ -109,9 +103,6 @@ struct hdmi_platform_config { ...@@ -109,9 +103,6 @@ struct hdmi_platform_config {
/* clks that need to be on for screen pwr (ie pixel clk): */ /* clks that need to be on for screen pwr (ie pixel clk): */
const char **pwr_clk_names; const char **pwr_clk_names;
int pwr_clk_cnt; int pwr_clk_cnt;
/* gpio's: */
struct hdmi_gpio_data gpios[HDMI_MAX_NUM_GPIO];
}; };
struct hdmi_bridge { struct hdmi_bridge {
......
...@@ -60,48 +60,6 @@ static void msm_hdmi_phy_reset(struct hdmi *hdmi) ...@@ -60,48 +60,6 @@ static void msm_hdmi_phy_reset(struct hdmi *hdmi)
} }
} }
static int gpio_config(struct hdmi *hdmi, bool on)
{
const struct hdmi_platform_config *config = hdmi->config;
int i;
if (on) {
for (i = 0; i < HDMI_MAX_NUM_GPIO; i++) {
struct hdmi_gpio_data gpio = config->gpios[i];
if (gpio.gpiod) {
if (gpio.output) {
gpiod_direction_output(gpio.gpiod,
gpio.value);
} else {
gpiod_direction_input(gpio.gpiod);
gpiod_set_value_cansleep(gpio.gpiod,
gpio.value);
}
}
}
DBG("gpio on");
} else {
for (i = 0; i < HDMI_MAX_NUM_GPIO; i++) {
struct hdmi_gpio_data gpio = config->gpios[i];
if (!gpio.gpiod)
continue;
if (gpio.output) {
int value = gpio.value ? 0 : 1;
gpiod_set_value_cansleep(gpio.gpiod, value);
}
}
DBG("gpio off");
}
return 0;
}
static void enable_hpd_clocks(struct hdmi *hdmi, bool enable) static void enable_hpd_clocks(struct hdmi *hdmi, bool enable)
{ {
const struct hdmi_platform_config *config = hdmi->config; const struct hdmi_platform_config *config = hdmi->config;
...@@ -154,11 +112,8 @@ int msm_hdmi_hpd_enable(struct drm_bridge *bridge) ...@@ -154,11 +112,8 @@ int msm_hdmi_hpd_enable(struct drm_bridge *bridge)
goto fail; goto fail;
} }
ret = gpio_config(hdmi, true); if (hdmi->hpd_gpiod)
if (ret) { gpiod_set_value_cansleep(hdmi->hpd_gpiod, 1);
DRM_DEV_ERROR(dev, "failed to configure GPIOs: %d\n", ret);
goto fail;
}
pm_runtime_get_sync(dev); pm_runtime_get_sync(dev);
enable_hpd_clocks(hdmi, true); enable_hpd_clocks(hdmi, true);
...@@ -207,10 +162,6 @@ void msm_hdmi_hpd_disable(struct hdmi_bridge *hdmi_bridge) ...@@ -207,10 +162,6 @@ void msm_hdmi_hpd_disable(struct hdmi_bridge *hdmi_bridge)
enable_hpd_clocks(hdmi, false); enable_hpd_clocks(hdmi, false);
pm_runtime_put(dev); pm_runtime_put(dev);
ret = gpio_config(hdmi, false);
if (ret)
dev_warn(dev, "failed to unconfigure GPIOs: %d\n", ret);
ret = pinctrl_pm_select_sleep_state(dev); ret = pinctrl_pm_select_sleep_state(dev);
if (ret) if (ret)
dev_warn(dev, "pinctrl state chg failed: %d\n", ret); dev_warn(dev, "pinctrl state chg failed: %d\n", ret);
...@@ -269,10 +220,7 @@ static enum drm_connector_status detect_reg(struct hdmi *hdmi) ...@@ -269,10 +220,7 @@ static enum drm_connector_status detect_reg(struct hdmi *hdmi)
#define HPD_GPIO_INDEX 2 #define HPD_GPIO_INDEX 2
static enum drm_connector_status detect_gpio(struct hdmi *hdmi) static enum drm_connector_status detect_gpio(struct hdmi *hdmi)
{ {
const struct hdmi_platform_config *config = hdmi->config; return gpiod_get_value(hdmi->hpd_gpiod) ?
struct hdmi_gpio_data hpd_gpio = config->gpios[HPD_GPIO_INDEX];
return gpiod_get_value(hpd_gpio.gpiod) ?
connector_status_connected : connector_status_connected :
connector_status_disconnected; connector_status_disconnected;
} }
...@@ -282,8 +230,6 @@ enum drm_connector_status msm_hdmi_bridge_detect( ...@@ -282,8 +230,6 @@ enum drm_connector_status msm_hdmi_bridge_detect(
{ {
struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge); struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge);
struct hdmi *hdmi = hdmi_bridge->hdmi; struct hdmi *hdmi = hdmi_bridge->hdmi;
const struct hdmi_platform_config *config = hdmi->config;
struct hdmi_gpio_data hpd_gpio = config->gpios[HPD_GPIO_INDEX];
enum drm_connector_status stat_gpio, stat_reg; enum drm_connector_status stat_gpio, stat_reg;
int retry = 20; int retry = 20;
...@@ -291,7 +237,7 @@ enum drm_connector_status msm_hdmi_bridge_detect( ...@@ -291,7 +237,7 @@ enum drm_connector_status msm_hdmi_bridge_detect(
* some platforms may not have hpd gpio. Rely only on the status * some platforms may not have hpd gpio. Rely only on the status
* provided by REG_HDMI_HPD_INT_STATUS in this case. * provided by REG_HDMI_HPD_INT_STATUS in this case.
*/ */
if (!hpd_gpio.gpiod) if (!hdmi->hpd_gpiod)
return detect_reg(hdmi); return detect_reg(hdmi);
do { do {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment