Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions include/linux/msm_gpio.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
* This shim preserves the legacy integer-GPIO calling convention for
* out-of-tree drivers that have not yet migrated to the descriptor API.
*
* fwnode_gpiod_get_index() does not mutate the fwnode; the non-const
* signature is a kernel API oversight.
* The cast to (struct fwnode_handle *) drops the const qualifier that
* of_fwnode_handle() preserves from its const device_node argument.
* fwnode_gpiod_get_index() does not mutate the fwnode; the non-const
Expand Down
20 changes: 6 additions & 14 deletions msm/dp/dp_gpio_hpd.c
Original file line number Diff line number Diff line change
Expand Up @@ -223,18 +223,18 @@ struct dp_hpd *dp_gpio_hpd_get(struct device *dev,
const char *hpd_gpio_name = "qcom,dp-hpd-gpio";
struct dp_gpio_hpd_private *gpio_hpd;
struct dp_pinctrl pinctrl = {0};
unsigned int gpio;
struct gpio_desc *gpiod;

if (!dev || !cb) {
DP_ERR("invalid device\n");
rc = -EINVAL;
goto error;
}

gpio = of_get_named_gpio(dev->of_node, hpd_gpio_name, 0);
if (!gpio_is_valid(gpio)) {
gpiod = devm_gpiod_get(dev, "qcom,dp-hpd", GPIOD_IN);
if (IS_ERR(gpiod)) {
DP_DEBUG("%s gpio not specified\n", hpd_gpio_name);
rc = -EINVAL;
rc = PTR_ERR(gpiod);
goto error;
}

Expand All @@ -258,22 +258,14 @@ struct dp_hpd *dp_gpio_hpd_get(struct device *dev,
}
}

gpio_hpd->gpio_cfg.gpio = gpio;
gpio_hpd->gpio_cfg.gpio = desc_to_gpio(gpiod);
strscpy(gpio_hpd->gpio_cfg.gpio_name, hpd_gpio_name,
sizeof(gpio_hpd->gpio_cfg.gpio_name));
gpio_hpd->gpio_cfg.value = 0;

rc = gpio_request(gpio_hpd->gpio_cfg.gpio,
gpio_hpd->gpio_cfg.gpio_name);
if (rc) {
DP_ERR("%s: failed to request gpio\n", hpd_gpio_name);
goto gpio_error;
}
gpio_direction_input(gpio_hpd->gpio_cfg.gpio);

gpio_hpd->dev = dev;
gpio_hpd->cb = cb;
gpio_hpd->irq = gpio_to_irq(gpio_hpd->gpio_cfg.gpio);
gpio_hpd->irq = gpiod_to_irq(gpiod);
INIT_DELAYED_WORK(&gpio_hpd->work, dp_gpio_hpd_work);

gpio_hpd->base.simulate_connect = dp_gpio_hpd_simulate_connect;
Expand Down
20 changes: 6 additions & 14 deletions msm/dp/dp_lphw_hpd.c
Original file line number Diff line number Diff line change
Expand Up @@ -350,18 +350,18 @@ struct dp_hpd *dp_lphw_hpd_get(struct device *dev, struct dp_parser *parser,
int rc = 0;
const char *hpd_gpio_name = "qcom,dp-hpd-gpio";
struct dp_lphw_hpd_private *lphw_hpd = NULL;
unsigned int gpio;
struct gpio_desc *gpiod;

if (!dev || !parser || !cb) {
DP_ERR("invalid device\n");
rc = -EINVAL;
goto error;
}

gpio = of_get_named_gpio(dev->of_node, hpd_gpio_name, 0);
if (!gpio_is_valid(gpio)) {
gpiod = devm_gpiod_get(dev, "qcom,dp-hpd", GPIOD_IN);
if (IS_ERR(gpiod)) {
DP_DEBUG("%s gpio not specified\n", hpd_gpio_name);
rc = -EINVAL;
rc = PTR_ERR(gpiod);
goto error;
}

Expand All @@ -371,22 +371,14 @@ struct dp_hpd *dp_lphw_hpd_get(struct device *dev, struct dp_parser *parser,
goto error;
}

lphw_hpd->gpio_cfg.gpio = gpio;
lphw_hpd->gpio_cfg.gpio = desc_to_gpio(gpiod);
strscpy(lphw_hpd->gpio_cfg.gpio_name, hpd_gpio_name,
sizeof(lphw_hpd->gpio_cfg.gpio_name));
lphw_hpd->gpio_cfg.value = 0;

rc = gpio_request(lphw_hpd->gpio_cfg.gpio,
lphw_hpd->gpio_cfg.gpio_name);
if (rc) {
DP_ERR("%s: failed to request gpio\n", hpd_gpio_name);
goto gpio_error;
}
gpio_direction_input(lphw_hpd->gpio_cfg.gpio);

lphw_hpd->dev = dev;
lphw_hpd->cb = cb;
lphw_hpd->irq = gpio_to_irq(lphw_hpd->gpio_cfg.gpio);
lphw_hpd->irq = gpiod_to_irq(gpiod);

rc = dp_lphw_hpd_create_workqueue(lphw_hpd);
if (rc) {
Expand Down
21 changes: 16 additions & 5 deletions msm/dsi/dsi_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <linux/list.h>
#include <linux/of.h>
#include <linux/msm_gpio.h>
#include <linux/gpio/consumer.h>
#include <linux/err.h>
#include <linux/version.h>
#include <linux/ktime.h>
Expand Down Expand Up @@ -711,8 +712,16 @@ static void dsi_display_parse_te_data(struct dsi_display *display)
return;
}

display->disp_te_gpio = of_get_named_gpio(dev->of_node,
"qcom,platform-te-gpio", 0);
display->disp_te_gpiod = devm_gpiod_get(dev, "qcom,platform-te",
GPIOD_IN);
if (IS_ERR(display->disp_te_gpiod)) {
DSI_DEBUG("te gpio not specified, rc=%ld\n",
PTR_ERR(display->disp_te_gpiod));
display->disp_te_gpiod = NULL;
display->disp_te_gpio = -EINVAL;
} else {
display->disp_te_gpio = desc_to_gpio(display->disp_te_gpiod);
}

if (display->fw)
rc = dsi_parser_read_u32(display->parser_node,
Expand Down Expand Up @@ -6041,6 +6050,7 @@ static int dsi_display_get_io_resources(struct msm_io_res *io_res, void *data)
struct dsi_display *display;
struct platform_device *pdev;
int te_gpio, avdd_gpio;
struct gpio_desc *avdd_gpiod;

if (!data)
return -EINVAL;
Expand All @@ -6063,7 +6073,7 @@ static int dsi_display_get_io_resources(struct msm_io_res *io_res, void *data)
if (rc)
return rc;

te_gpio = of_get_named_gpio(pdev->dev.of_node, "qcom,platform-te-gpio", 0);
te_gpio = display->disp_te_gpio;
if (gpio_is_valid(te_gpio)) {
rc = msm_dss_get_gpio_io_mem(te_gpio, &io_res->mem);
if (rc) {
Expand All @@ -6073,8 +6083,9 @@ static int dsi_display_get_io_resources(struct msm_io_res *io_res, void *data)
}
}

avdd_gpio = of_get_named_gpio(pdev->dev.of_node,
"qcom,avdd-regulator-gpio", 0);
avdd_gpiod = devm_gpiod_get(&pdev->dev, "qcom,avdd-regulator",
GPIOD_ASIS);
avdd_gpio = IS_ERR(avdd_gpiod) ? -EINVAL : desc_to_gpio(avdd_gpiod);
if (gpio_is_valid(avdd_gpio)) {
rc = msm_dss_get_gpio_io_mem(avdd_gpio, &io_res->mem);
if (rc)
Expand Down
5 changes: 4 additions & 1 deletion msm/dsi/dsi_display.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include <linux/bitops.h>
#include <linux/debugfs.h>
#include <linux/of_device.h>
#include <linux/gpio/consumer.h>
#include <linux/firmware.h>
#include <linux/ktime.h>
#include <drm/drm_crtc.h>
Expand Down Expand Up @@ -192,7 +193,8 @@ struct dsi_display_ops {
* @sw_te_using_wd: Is software te enabled
* @display_lock: Mutex for dsi_display interface.
* @disp_te_gpio: GPIO for panel TE interrupt.
* @is_te_irq_enabled:bool to specify whether TE interrupt is enabled.
* @disp_te_gpiod: GPIO descriptor for panel TE interrupt (kernel >= 7.1).
* @is_te_irq_enabled:bool to specify whether TE interrupt is enabled.
* @esd_te_gate: completion gate to signal TE interrupt.
* @ctrl_count: Number of DSI interfaces required by panel.
* @ctrl: Controller information for DSI display.
Expand Down Expand Up @@ -261,6 +263,7 @@ struct dsi_display {
bool sw_te_using_wd;
struct mutex display_lock;
int disp_te_gpio;
struct gpio_desc *disp_te_gpiod;
bool is_te_irq_enabled;
struct completion esd_te_gate;

Expand Down
Loading
Loading