18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * Copyright (C) 2009 Francisco Jerez.
38c2ecf20Sopenharmony_ci * All Rights Reserved.
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining
68c2ecf20Sopenharmony_ci * a copy of this software and associated documentation files (the
78c2ecf20Sopenharmony_ci * "Software"), to deal in the Software without restriction, including
88c2ecf20Sopenharmony_ci * without limitation the rights to use, copy, modify, merge, publish,
98c2ecf20Sopenharmony_ci * distribute, sublicense, and/or sell copies of the Software, and to
108c2ecf20Sopenharmony_ci * permit persons to whom the Software is furnished to do so, subject to
118c2ecf20Sopenharmony_ci * the following conditions:
128c2ecf20Sopenharmony_ci *
138c2ecf20Sopenharmony_ci * The above copyright notice and this permission notice (including the
148c2ecf20Sopenharmony_ci * next paragraph) shall be included in all copies or substantial
158c2ecf20Sopenharmony_ci * portions of the Software.
168c2ecf20Sopenharmony_ci *
178c2ecf20Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
188c2ecf20Sopenharmony_ci * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
198c2ecf20Sopenharmony_ci * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
208c2ecf20Sopenharmony_ci * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
218c2ecf20Sopenharmony_ci * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
228c2ecf20Sopenharmony_ci * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
238c2ecf20Sopenharmony_ci * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
248c2ecf20Sopenharmony_ci *
258c2ecf20Sopenharmony_ci */
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci#ifndef __DRM_ENCODER_SLAVE_H__
288c2ecf20Sopenharmony_ci#define __DRM_ENCODER_SLAVE_H__
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci#include <drm/drm_crtc.h>
318c2ecf20Sopenharmony_ci#include <drm/drm_encoder.h>
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci/**
348c2ecf20Sopenharmony_ci * struct drm_encoder_slave_funcs - Entry points exposed by a slave encoder driver
358c2ecf20Sopenharmony_ci * @set_config:	Initialize any encoder-specific modesetting parameters.
368c2ecf20Sopenharmony_ci *		The meaning of the @params parameter is implementation
378c2ecf20Sopenharmony_ci *		dependent. It will usually be a structure with DVO port
388c2ecf20Sopenharmony_ci *		data format settings or timings. It's not required for
398c2ecf20Sopenharmony_ci *		the new parameters to take effect until the next mode
408c2ecf20Sopenharmony_ci *		is set.
418c2ecf20Sopenharmony_ci *
428c2ecf20Sopenharmony_ci * Most of its members are analogous to the function pointers in
438c2ecf20Sopenharmony_ci * &drm_encoder_helper_funcs and they can optionally be used to
448c2ecf20Sopenharmony_ci * initialize the latter. Connector-like methods (e.g. @get_modes and
458c2ecf20Sopenharmony_ci * @set_property) will typically be wrapped around and only be called
468c2ecf20Sopenharmony_ci * if the encoder is the currently selected one for the connector.
478c2ecf20Sopenharmony_ci */
488c2ecf20Sopenharmony_cistruct drm_encoder_slave_funcs {
498c2ecf20Sopenharmony_ci	void (*set_config)(struct drm_encoder *encoder,
508c2ecf20Sopenharmony_ci			   void *params);
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci	void (*destroy)(struct drm_encoder *encoder);
538c2ecf20Sopenharmony_ci	void (*dpms)(struct drm_encoder *encoder, int mode);
548c2ecf20Sopenharmony_ci	void (*save)(struct drm_encoder *encoder);
558c2ecf20Sopenharmony_ci	void (*restore)(struct drm_encoder *encoder);
568c2ecf20Sopenharmony_ci	bool (*mode_fixup)(struct drm_encoder *encoder,
578c2ecf20Sopenharmony_ci			   const struct drm_display_mode *mode,
588c2ecf20Sopenharmony_ci			   struct drm_display_mode *adjusted_mode);
598c2ecf20Sopenharmony_ci	int (*mode_valid)(struct drm_encoder *encoder,
608c2ecf20Sopenharmony_ci			  struct drm_display_mode *mode);
618c2ecf20Sopenharmony_ci	void (*mode_set)(struct drm_encoder *encoder,
628c2ecf20Sopenharmony_ci			 struct drm_display_mode *mode,
638c2ecf20Sopenharmony_ci			 struct drm_display_mode *adjusted_mode);
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ci	enum drm_connector_status (*detect)(struct drm_encoder *encoder,
668c2ecf20Sopenharmony_ci					    struct drm_connector *connector);
678c2ecf20Sopenharmony_ci	int (*get_modes)(struct drm_encoder *encoder,
688c2ecf20Sopenharmony_ci			 struct drm_connector *connector);
698c2ecf20Sopenharmony_ci	int (*create_resources)(struct drm_encoder *encoder,
708c2ecf20Sopenharmony_ci				 struct drm_connector *connector);
718c2ecf20Sopenharmony_ci	int (*set_property)(struct drm_encoder *encoder,
728c2ecf20Sopenharmony_ci			    struct drm_connector *connector,
738c2ecf20Sopenharmony_ci			    struct drm_property *property,
748c2ecf20Sopenharmony_ci			    uint64_t val);
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_ci};
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_ci/**
798c2ecf20Sopenharmony_ci * struct drm_encoder_slave - Slave encoder struct
808c2ecf20Sopenharmony_ci * @base: DRM encoder object.
818c2ecf20Sopenharmony_ci * @slave_funcs: Slave encoder callbacks.
828c2ecf20Sopenharmony_ci * @slave_priv: Slave encoder private data.
838c2ecf20Sopenharmony_ci * @bus_priv: Bus specific data.
848c2ecf20Sopenharmony_ci *
858c2ecf20Sopenharmony_ci * A &drm_encoder_slave has two sets of callbacks, @slave_funcs and the
868c2ecf20Sopenharmony_ci * ones in @base. The former are never actually called by the common
878c2ecf20Sopenharmony_ci * CRTC code, it's just a convenience for splitting the encoder
888c2ecf20Sopenharmony_ci * functions in an upper, GPU-specific layer and a (hopefully)
898c2ecf20Sopenharmony_ci * GPU-agnostic lower layer: It's the GPU driver responsibility to
908c2ecf20Sopenharmony_ci * call the slave methods when appropriate.
918c2ecf20Sopenharmony_ci *
928c2ecf20Sopenharmony_ci * drm_i2c_encoder_init() provides a way to get an implementation of
938c2ecf20Sopenharmony_ci * this.
948c2ecf20Sopenharmony_ci */
958c2ecf20Sopenharmony_cistruct drm_encoder_slave {
968c2ecf20Sopenharmony_ci	struct drm_encoder base;
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci	const struct drm_encoder_slave_funcs *slave_funcs;
998c2ecf20Sopenharmony_ci	void *slave_priv;
1008c2ecf20Sopenharmony_ci	void *bus_priv;
1018c2ecf20Sopenharmony_ci};
1028c2ecf20Sopenharmony_ci#define to_encoder_slave(x) container_of((x), struct drm_encoder_slave, base)
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_ciint drm_i2c_encoder_init(struct drm_device *dev,
1058c2ecf20Sopenharmony_ci			 struct drm_encoder_slave *encoder,
1068c2ecf20Sopenharmony_ci			 struct i2c_adapter *adap,
1078c2ecf20Sopenharmony_ci			 const struct i2c_board_info *info);
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_ci/**
1118c2ecf20Sopenharmony_ci * struct drm_i2c_encoder_driver
1128c2ecf20Sopenharmony_ci *
1138c2ecf20Sopenharmony_ci * Describes a device driver for an encoder connected to the GPU
1148c2ecf20Sopenharmony_ci * through an I2C bus. In addition to the entry points in @i2c_driver
1158c2ecf20Sopenharmony_ci * an @encoder_init function should be provided. It will be called to
1168c2ecf20Sopenharmony_ci * give the driver an opportunity to allocate any per-encoder data
1178c2ecf20Sopenharmony_ci * structures and to initialize the @slave_funcs and (optionally)
1188c2ecf20Sopenharmony_ci * @slave_priv members of @encoder.
1198c2ecf20Sopenharmony_ci */
1208c2ecf20Sopenharmony_cistruct drm_i2c_encoder_driver {
1218c2ecf20Sopenharmony_ci	struct i2c_driver i2c_driver;
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_ci	int (*encoder_init)(struct i2c_client *client,
1248c2ecf20Sopenharmony_ci			    struct drm_device *dev,
1258c2ecf20Sopenharmony_ci			    struct drm_encoder_slave *encoder);
1268c2ecf20Sopenharmony_ci
1278c2ecf20Sopenharmony_ci};
1288c2ecf20Sopenharmony_ci#define to_drm_i2c_encoder_driver(x) container_of((x),			\
1298c2ecf20Sopenharmony_ci						  struct drm_i2c_encoder_driver, \
1308c2ecf20Sopenharmony_ci						  i2c_driver)
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_ci/**
1338c2ecf20Sopenharmony_ci * drm_i2c_encoder_get_client - Get the I2C client corresponding to an encoder
1348c2ecf20Sopenharmony_ci */
1358c2ecf20Sopenharmony_cistatic inline struct i2c_client *drm_i2c_encoder_get_client(struct drm_encoder *encoder)
1368c2ecf20Sopenharmony_ci{
1378c2ecf20Sopenharmony_ci	return (struct i2c_client *)to_encoder_slave(encoder)->bus_priv;
1388c2ecf20Sopenharmony_ci}
1398c2ecf20Sopenharmony_ci
1408c2ecf20Sopenharmony_ci/**
1418c2ecf20Sopenharmony_ci * drm_i2c_encoder_register - Register an I2C encoder driver
1428c2ecf20Sopenharmony_ci * @owner:	Module containing the driver.
1438c2ecf20Sopenharmony_ci * @driver:	Driver to be registered.
1448c2ecf20Sopenharmony_ci */
1458c2ecf20Sopenharmony_cistatic inline int drm_i2c_encoder_register(struct module *owner,
1468c2ecf20Sopenharmony_ci					   struct drm_i2c_encoder_driver *driver)
1478c2ecf20Sopenharmony_ci{
1488c2ecf20Sopenharmony_ci	return i2c_register_driver(owner, &driver->i2c_driver);
1498c2ecf20Sopenharmony_ci}
1508c2ecf20Sopenharmony_ci
1518c2ecf20Sopenharmony_ci/**
1528c2ecf20Sopenharmony_ci * drm_i2c_encoder_unregister - Unregister an I2C encoder driver
1538c2ecf20Sopenharmony_ci * @driver:	Driver to be unregistered.
1548c2ecf20Sopenharmony_ci */
1558c2ecf20Sopenharmony_cistatic inline void drm_i2c_encoder_unregister(struct drm_i2c_encoder_driver *driver)
1568c2ecf20Sopenharmony_ci{
1578c2ecf20Sopenharmony_ci	i2c_del_driver(&driver->i2c_driver);
1588c2ecf20Sopenharmony_ci}
1598c2ecf20Sopenharmony_ci
1608c2ecf20Sopenharmony_civoid drm_i2c_encoder_destroy(struct drm_encoder *encoder);
1618c2ecf20Sopenharmony_ci
1628c2ecf20Sopenharmony_ci
1638c2ecf20Sopenharmony_ci/*
1648c2ecf20Sopenharmony_ci * Wrapper fxns which can be plugged in to drm_encoder_helper_funcs:
1658c2ecf20Sopenharmony_ci */
1668c2ecf20Sopenharmony_ci
1678c2ecf20Sopenharmony_civoid drm_i2c_encoder_dpms(struct drm_encoder *encoder, int mode);
1688c2ecf20Sopenharmony_cibool drm_i2c_encoder_mode_fixup(struct drm_encoder *encoder,
1698c2ecf20Sopenharmony_ci		const struct drm_display_mode *mode,
1708c2ecf20Sopenharmony_ci		struct drm_display_mode *adjusted_mode);
1718c2ecf20Sopenharmony_civoid drm_i2c_encoder_prepare(struct drm_encoder *encoder);
1728c2ecf20Sopenharmony_civoid drm_i2c_encoder_commit(struct drm_encoder *encoder);
1738c2ecf20Sopenharmony_civoid drm_i2c_encoder_mode_set(struct drm_encoder *encoder,
1748c2ecf20Sopenharmony_ci		struct drm_display_mode *mode,
1758c2ecf20Sopenharmony_ci		struct drm_display_mode *adjusted_mode);
1768c2ecf20Sopenharmony_cienum drm_connector_status drm_i2c_encoder_detect(struct drm_encoder *encoder,
1778c2ecf20Sopenharmony_ci	    struct drm_connector *connector);
1788c2ecf20Sopenharmony_civoid drm_i2c_encoder_save(struct drm_encoder *encoder);
1798c2ecf20Sopenharmony_civoid drm_i2c_encoder_restore(struct drm_encoder *encoder);
1808c2ecf20Sopenharmony_ci
1818c2ecf20Sopenharmony_ci
1828c2ecf20Sopenharmony_ci#endif
183