0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027 #ifndef __DRM_ENCODER_SLAVE_H__
0028 #define __DRM_ENCODER_SLAVE_H__
0029
0030 #include <linux/i2c.h>
0031
0032 #include <drm/drm_crtc.h>
0033 #include <drm/drm_encoder.h>
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050 struct drm_encoder_slave_funcs {
0051 void (*set_config)(struct drm_encoder *encoder,
0052 void *params);
0053
0054 void (*destroy)(struct drm_encoder *encoder);
0055 void (*dpms)(struct drm_encoder *encoder, int mode);
0056 void (*save)(struct drm_encoder *encoder);
0057 void (*restore)(struct drm_encoder *encoder);
0058 bool (*mode_fixup)(struct drm_encoder *encoder,
0059 const struct drm_display_mode *mode,
0060 struct drm_display_mode *adjusted_mode);
0061 int (*mode_valid)(struct drm_encoder *encoder,
0062 struct drm_display_mode *mode);
0063 void (*mode_set)(struct drm_encoder *encoder,
0064 struct drm_display_mode *mode,
0065 struct drm_display_mode *adjusted_mode);
0066
0067 enum drm_connector_status (*detect)(struct drm_encoder *encoder,
0068 struct drm_connector *connector);
0069 int (*get_modes)(struct drm_encoder *encoder,
0070 struct drm_connector *connector);
0071 int (*create_resources)(struct drm_encoder *encoder,
0072 struct drm_connector *connector);
0073 int (*set_property)(struct drm_encoder *encoder,
0074 struct drm_connector *connector,
0075 struct drm_property *property,
0076 uint64_t val);
0077
0078 };
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097 struct drm_encoder_slave {
0098 struct drm_encoder base;
0099
0100 const struct drm_encoder_slave_funcs *slave_funcs;
0101 void *slave_priv;
0102 void *bus_priv;
0103 };
0104 #define to_encoder_slave(x) container_of((x), struct drm_encoder_slave, base)
0105
0106 int drm_i2c_encoder_init(struct drm_device *dev,
0107 struct drm_encoder_slave *encoder,
0108 struct i2c_adapter *adap,
0109 const struct i2c_board_info *info);
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122 struct drm_i2c_encoder_driver {
0123 struct i2c_driver i2c_driver;
0124
0125 int (*encoder_init)(struct i2c_client *client,
0126 struct drm_device *dev,
0127 struct drm_encoder_slave *encoder);
0128
0129 };
0130 #define to_drm_i2c_encoder_driver(x) container_of((x), \
0131 struct drm_i2c_encoder_driver, \
0132 i2c_driver)
0133
0134
0135
0136
0137 static inline struct i2c_client *drm_i2c_encoder_get_client(struct drm_encoder *encoder)
0138 {
0139 return (struct i2c_client *)to_encoder_slave(encoder)->bus_priv;
0140 }
0141
0142
0143
0144
0145
0146
0147 static inline int drm_i2c_encoder_register(struct module *owner,
0148 struct drm_i2c_encoder_driver *driver)
0149 {
0150 return i2c_register_driver(owner, &driver->i2c_driver);
0151 }
0152
0153
0154
0155
0156
0157 static inline void drm_i2c_encoder_unregister(struct drm_i2c_encoder_driver *driver)
0158 {
0159 i2c_del_driver(&driver->i2c_driver);
0160 }
0161
0162 void drm_i2c_encoder_destroy(struct drm_encoder *encoder);
0163
0164
0165
0166
0167
0168
0169 void drm_i2c_encoder_dpms(struct drm_encoder *encoder, int mode);
0170 bool drm_i2c_encoder_mode_fixup(struct drm_encoder *encoder,
0171 const struct drm_display_mode *mode,
0172 struct drm_display_mode *adjusted_mode);
0173 void drm_i2c_encoder_prepare(struct drm_encoder *encoder);
0174 void drm_i2c_encoder_commit(struct drm_encoder *encoder);
0175 void drm_i2c_encoder_mode_set(struct drm_encoder *encoder,
0176 struct drm_display_mode *mode,
0177 struct drm_display_mode *adjusted_mode);
0178 enum drm_connector_status drm_i2c_encoder_detect(struct drm_encoder *encoder,
0179 struct drm_connector *connector);
0180 void drm_i2c_encoder_save(struct drm_encoder *encoder);
0181 void drm_i2c_encoder_restore(struct drm_encoder *encoder);
0182
0183
0184 #endif