1
0
Fork 0

MLK-16207-1 drm/bridge: it6263: Add gpio reset support

A low pulse whose width is at least 40ms on pin SYSRSTN
may reset the bridge, according to the chip maker.
This patch adds gpio reset support for the bridge.

Signed-off-by: Liu Ying <victor.liu@nxp.com>
pull/10/head
Liu Ying 2017-08-15 15:59:44 +08:00 committed by Jason Liu
parent 77bb6a7264
commit 40b6d100a7
2 changed files with 39 additions and 0 deletions

View File

@ -10,6 +10,7 @@ Required properties:
Optional properties:
- split-mode: boolean. if this exists, split mode is enabled,
otherwise, single mode is enabled.
- reset-gpios: OF device-tree gpio specification for SYSRSTN pin.
[1]: Documentation/devicetree/bindings/media/video-interfaces.txt

View File

@ -16,6 +16,7 @@
#include <drm/drm_atomic_helper.h>
#include <drm/drm_crtc_helper.h>
#include <drm/drm_edid.h>
#include <linux/gpio/consumer.h>
#include <linux/i2c.h>
#include <linux/module.h>
#include <linux/regmap.h>
@ -314,6 +315,7 @@ struct it6263 {
struct regmap *lvds_regmap;
struct drm_bridge bridge;
struct drm_connector connector;
struct gpio_desc *reset_gpio;
bool is_hdmi;
bool split_mode;
};
@ -340,6 +342,29 @@ static inline void hdmi_update_bits(struct it6263 *it6263, unsigned int reg,
regmap_update_bits(it6263->hdmi_regmap, reg, mask, val);
}
static void it6263_reset(struct it6263 *it6263)
{
if (!it6263->reset_gpio)
return;
gpiod_set_value_cansleep(it6263->reset_gpio, 0);
usleep_range(1000, 2000);
gpiod_set_value_cansleep(it6263->reset_gpio, 1);
/*
* The chip maker says the low pulse should be at least 40ms,
* so 41ms is sure to be enough.
*/
usleep_range(41000, 45000);
gpiod_set_value_cansleep(it6263->reset_gpio, 0);
/* somehow, addtional time to wait the high voltage to be stable */
usleep_range(5000, 6000);
}
static enum drm_connector_status
it6263_connector_detect(struct drm_connector *connector, bool force)
{
@ -782,6 +807,19 @@ static int it6263_probe(struct i2c_client *client,
goto unregister_lvds_i2c;
}
it6263->reset_gpio = devm_gpiod_get_optional(dev, "reset",
GPIOD_OUT_LOW);
if (IS_ERR(it6263->reset_gpio)) {
ret = PTR_ERR(it6263->reset_gpio);
if (ret != -EPROBE_DEFER)
dev_err(dev, "Failed to get reset gpio: %d\n", ret);
goto unregister_lvds_i2c;
}
it6263_reset(it6263);
ret = regmap_write(it6263->hdmi_regmap, HDMI_REG_SW_RST, HDMI_RST_ALL);
if (ret)
goto unregister_lvds_i2c;