/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * Copyright (C) 2015 Google, Inc
 * Written by Simon Glass <sjg@chromium.org>
 */

#ifndef __VIDEO_BRIDGE
#define __VIDEO_BRIDGE

#include <asm/gpio.h>

/**
 * struct video_bridge_priv - uclass information for video bridges
 *
 * @sleep:	GPIO to assert to power down the bridge
 * @reset:	GPIO to assert to reset the bridge
 * @hotplug:	Optional GPIO to check if bridge is connected
 */
struct video_bridge_priv {
	struct gpio_desc sleep;
	struct gpio_desc reset;
	struct gpio_desc hotplug;
};

/**
 * Operations for video bridges
 */
struct video_bridge_ops {
	/**
	 * attach() - attach a video bridge
	 *
	 * @return 0 if OK, -ve on error
	 */
	int (*attach)(struct udevice *dev);

	/**
	 * check_attached() - check if a bridge is correctly attached
	 *
	 * This method is optional - if not provided then the hotplug GPIO
	 * will be checked instead.
	 *
	 * @dev:	Device to check
	 * @return 0 if attached, -EENOTCONN if not, or other -ve error
	 */
	int (*check_attached)(struct udevice *dev);

	/**
	 * set_backlight() - Set the backlight brightness
	 *
	 * @dev:	device to adjust
	 * @percent:	brightness percentage (0=off, 100=full brightness)
	 * @return 0 if OK, -ve on error
	 */
	int (*set_backlight)(struct udevice *dev, int percent);

	/**
	 * get_display_timing() - Get display timings from bridge.
	 *
	 * @dev:	Bridge device containing the linked display timings
	 * @tim:	Place to put timings
	 * @return 0 if OK, -ve on error
	 *
	 * This call it totally optional and useful mainly for integrated
	 * bridges with fixed output device.
	 */
	int (*get_display_timing)(struct udevice *dev,
				  struct display_timing *timing);

	/**
	 * read_edid() - Read information from EDID
	 *
	 * @dev:	Device to read from
	 * @buf:	Buffer to read into
	 * @buf_size:	Buffer size
	 * @return number of bytes read, <=0 for error
	 */
	int (*read_edid)(struct udevice *dev, u8 *buf, int buf_size);
};

#define video_bridge_get_ops(dev) \
		((struct video_bridge_ops *)(dev)->driver->ops)

#if CONFIG_IS_ENABLED(VIDEO_BRIDGE)
/**
 * video_bridge_attach() - attach a video bridge
 *
 * Return: 0 if OK, -ve on error
 */
int video_bridge_attach(struct udevice *dev);

/**
 * video_bridge_set_backlight() - Set the backlight brightness
 *
 * @percent:	brightness percentage (0=off, 100=full brightness)
 * Return: 0 if OK, -ve on error
 */
int video_bridge_set_backlight(struct udevice *dev, int percent);

/**
 * video_bridge_set_active() - take the bridge in/out of reset/powerdown
 *
 * @dev:	Device to adjust
 * @active:	true to power up and reset, false to power down
 */
int video_bridge_set_active(struct udevice *dev, bool active);

/**
 * check_attached() - check if a bridge is correctly attached
 *
 * @dev:	Device to check
 * Return: 0 if attached, -EENOTCONN if not, or other -ve error
 */
int video_bridge_check_attached(struct udevice *dev);

/**
 * video_bridge_get_display_timing() - Get display timings from bridge.
 *
 * @dev:	Bridge device containing the linked display timings
 * Return: 0 if OK, -ve on error
 */
int video_bridge_get_display_timing(struct udevice *dev,
				    struct display_timing *timing);
/**
 * video_bridge_read_edid() - Read information from EDID
 *
 * @dev:	Device to read from
 * @buf:	Buffer to read into
 * @buf_size:	Buffer size
 * Return: number of bytes read, <=0 for error
 */
int video_bridge_read_edid(struct udevice *dev, u8 *buf, int buf_size);
#else
static inline int video_bridge_attach(struct udevice *dev)
{
	return -ENOSYS;
}

static inline int video_bridge_set_backlight(struct udevice *dev, int percent)
{
	return -ENOSYS;
}

static inline int video_bridge_set_active(struct udevice *dev, bool active)
{
	return -ENOSYS;
}

static inline int video_bridge_check_attached(struct udevice *dev)
{
	return -ENOSYS;
}

static inline int video_bridge_get_display_timing(struct udevice *dev,
						  struct display_timing *timing)
{
	return -ENOSYS;
}

static inline int video_bridge_read_edid(struct udevice *dev, u8 *buf, int buf_size)
{
	return -ENOSYS;
}
#endif /* CONFIG_VIDEO_BRIDGE */

#endif
