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

#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);
};

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

/**
 * 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);

#endif
