drm: Minimally initialise drm_dp_aux
When trying to split up the initialisation phase and the registration phase, one immediate problem encountered is trying to use our own i2c devices before registration with userspace (to read EDID during device discovery). drm_dp_aux in particular only offers an interface for setting up the device *after* we have exposed the connector via sysfs. In order to break the chicken-and-egg problem, export drm_dp_aux_init() to minimally prepare the i2c device for internal use before drm_connector_register(). Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Dave Airlie <airlied@redhat.com> Cc: Rafael Antognolli <rafael.antognolli@intel.com> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Cc: dri-devel@lists.freedesktop.org [danvet: Amend kerneldoc slightly.] Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: http://patchwork.freedesktop.org/patch/msgid/1466152398-20157-3-git-send-email-chris@chris-wilson.co.uk
This commit is contained in:
parent
0c2f6f1a56
commit
acd8f414c9
|
@ -791,15 +791,16 @@ static void unlock_bus(struct i2c_adapter *i2c, unsigned int flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* drm_dp_aux_register() - initialise and register aux channel
|
* drm_dp_aux_init() - minimally initialise an aux channel
|
||||||
* @aux: DisplayPort AUX channel
|
* @aux: DisplayPort AUX channel
|
||||||
*
|
*
|
||||||
* Returns 0 on success or a negative error code on failure.
|
* If you need to use the drm_dp_aux's i2c adapter prior to registering it
|
||||||
|
* with the outside world, call drm_dp_aux_init() first. You must still
|
||||||
|
* call drm_dp_aux_register() once the connector has been registered to
|
||||||
|
* allow userspace access to the auxiliary DP channel.
|
||||||
*/
|
*/
|
||||||
int drm_dp_aux_register(struct drm_dp_aux *aux)
|
void drm_dp_aux_init(struct drm_dp_aux *aux)
|
||||||
{
|
{
|
||||||
int ret;
|
|
||||||
|
|
||||||
mutex_init(&aux->hw_mutex);
|
mutex_init(&aux->hw_mutex);
|
||||||
|
|
||||||
aux->ddc.algo = &drm_dp_i2c_algo;
|
aux->ddc.algo = &drm_dp_i2c_algo;
|
||||||
|
@ -809,6 +810,23 @@ int drm_dp_aux_register(struct drm_dp_aux *aux)
|
||||||
aux->ddc.lock_bus = lock_bus;
|
aux->ddc.lock_bus = lock_bus;
|
||||||
aux->ddc.trylock_bus = trylock_bus;
|
aux->ddc.trylock_bus = trylock_bus;
|
||||||
aux->ddc.unlock_bus = unlock_bus;
|
aux->ddc.unlock_bus = unlock_bus;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(drm_dp_aux_init);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* drm_dp_aux_register() - initialise and register aux channel
|
||||||
|
* @aux: DisplayPort AUX channel
|
||||||
|
*
|
||||||
|
* Automatically calls drm_dp_aux_init() if this hasn't been done yet.
|
||||||
|
*
|
||||||
|
* Returns 0 on success or a negative error code on failure.
|
||||||
|
*/
|
||||||
|
int drm_dp_aux_register(struct drm_dp_aux *aux)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (!aux->ddc.algo)
|
||||||
|
drm_dp_aux_init(aux);
|
||||||
|
|
||||||
aux->ddc.class = I2C_CLASS_DDC;
|
aux->ddc.class = I2C_CLASS_DDC;
|
||||||
aux->ddc.owner = THIS_MODULE;
|
aux->ddc.owner = THIS_MODULE;
|
||||||
|
|
|
@ -805,6 +805,7 @@ int drm_dp_link_power_up(struct drm_dp_aux *aux, struct drm_dp_link *link);
|
||||||
int drm_dp_link_power_down(struct drm_dp_aux *aux, struct drm_dp_link *link);
|
int drm_dp_link_power_down(struct drm_dp_aux *aux, struct drm_dp_link *link);
|
||||||
int drm_dp_link_configure(struct drm_dp_aux *aux, struct drm_dp_link *link);
|
int drm_dp_link_configure(struct drm_dp_aux *aux, struct drm_dp_link *link);
|
||||||
|
|
||||||
|
void drm_dp_aux_init(struct drm_dp_aux *aux);
|
||||||
int drm_dp_aux_register(struct drm_dp_aux *aux);
|
int drm_dp_aux_register(struct drm_dp_aux *aux);
|
||||||
void drm_dp_aux_unregister(struct drm_dp_aux *aux);
|
void drm_dp_aux_unregister(struct drm_dp_aux *aux);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue