diff options
Diffstat (limited to 'drivers/gpu/drm/ast/ast_mode.c')
| -rw-r--r-- | drivers/gpu/drm/ast/ast_mode.c | 156 | 
1 files changed, 15 insertions, 141 deletions
diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c index 1e30eaeb0e1b..956c8982192b 100644 --- a/drivers/gpu/drm/ast/ast_mode.c +++ b/drivers/gpu/drm/ast/ast_mode.c @@ -47,9 +47,6 @@  #include "ast_drv.h"  #include "ast_tables.h" -static struct ast_i2c_chan *ast_i2c_create(struct drm_device *dev); -static void ast_i2c_destroy(struct ast_i2c_chan *i2c); -  static inline void ast_load_palette_index(struct ast_private *ast,  				     u8 index, u8 red, u8 green,  				     u8 blue) @@ -1121,7 +1118,10 @@ static void ast_crtc_reset(struct drm_crtc *crtc)  	if (crtc->state)  		crtc->funcs->atomic_destroy_state(crtc, crtc->state); -	__drm_atomic_helper_crtc_reset(crtc, &ast_state->base); +	if (ast_state) +		__drm_atomic_helper_crtc_reset(crtc, &ast_state->base); +	else +		__drm_atomic_helper_crtc_reset(crtc, NULL);  }  static struct drm_crtc_state * @@ -1210,9 +1210,9 @@ static int ast_get_modes(struct drm_connector *connector)  {  	struct ast_connector *ast_connector = to_ast_connector(connector);  	struct ast_private *ast = to_ast_private(connector->dev); -	struct edid *edid; -	int ret; +	struct edid *edid = NULL;  	bool flags = false; +	int ret;  	if (ast->tx_chip_type == AST_TX_DP501) {  		ast->dp501_maxclk = 0xff; @@ -1226,7 +1226,7 @@ static int ast_get_modes(struct drm_connector *connector)  		else  			kfree(edid);  	} -	if (!flags) +	if (!flags && ast_connector->i2c)  		edid = drm_get_edid(connector, &ast_connector->i2c->adapter);  	if (edid) {  		drm_connector_update_edid_property(&ast_connector->base, edid); @@ -1300,14 +1300,6 @@ static enum drm_mode_status ast_mode_valid(struct drm_connector *connector,  	return flags;  } -static void ast_connector_destroy(struct drm_connector *connector) -{ -	struct ast_connector *ast_connector = to_ast_connector(connector); - -	ast_i2c_destroy(ast_connector->i2c); -	drm_connector_cleanup(connector); -} -  static const struct drm_connector_helper_funcs ast_connector_helper_funcs = {  	.get_modes = ast_get_modes,  	.mode_valid = ast_mode_valid, @@ -1316,7 +1308,7 @@ static const struct drm_connector_helper_funcs ast_connector_helper_funcs = {  static const struct drm_connector_funcs ast_connector_funcs = {  	.reset = drm_atomic_helper_connector_reset,  	.fill_modes = drm_helper_probe_single_connector_modes, -	.destroy = ast_connector_destroy, +	.destroy = drm_connector_cleanup,  	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,  	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,  }; @@ -1332,10 +1324,13 @@ static int ast_connector_init(struct drm_device *dev)  	if (!ast_connector->i2c)  		drm_err(dev, "failed to add ddc bus for connector\n"); -	drm_connector_init_with_ddc(dev, connector, -				    &ast_connector_funcs, -				    DRM_MODE_CONNECTOR_VGA, -				    &ast_connector->i2c->adapter); +	if (ast_connector->i2c) +		drm_connector_init_with_ddc(dev, connector, &ast_connector_funcs, +					    DRM_MODE_CONNECTOR_VGA, +					    &ast_connector->i2c->adapter); +	else +		drm_connector_init(dev, connector, &ast_connector_funcs, +				   DRM_MODE_CONNECTOR_VGA);  	drm_connector_helper_add(connector, &ast_connector_helper_funcs); @@ -1413,124 +1408,3 @@ int ast_mode_config_init(struct ast_private *ast)  	return 0;  } - -static int get_clock(void *i2c_priv) -{ -	struct ast_i2c_chan *i2c = i2c_priv; -	struct ast_private *ast = to_ast_private(i2c->dev); -	uint32_t val, val2, count, pass; - -	count = 0; -	pass = 0; -	val = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x10) >> 4) & 0x01; -	do { -		val2 = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x10) >> 4) & 0x01; -		if (val == val2) { -			pass++; -		} else { -			pass = 0; -			val = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x10) >> 4) & 0x01; -		} -	} while ((pass < 5) && (count++ < 0x10000)); - -	return val & 1 ? 1 : 0; -} - -static int get_data(void *i2c_priv) -{ -	struct ast_i2c_chan *i2c = i2c_priv; -	struct ast_private *ast = to_ast_private(i2c->dev); -	uint32_t val, val2, count, pass; - -	count = 0; -	pass = 0; -	val = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x20) >> 5) & 0x01; -	do { -		val2 = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x20) >> 5) & 0x01; -		if (val == val2) { -			pass++; -		} else { -			pass = 0; -			val = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x20) >> 5) & 0x01; -		} -	} while ((pass < 5) && (count++ < 0x10000)); - -	return val & 1 ? 1 : 0; -} - -static void set_clock(void *i2c_priv, int clock) -{ -	struct ast_i2c_chan *i2c = i2c_priv; -	struct ast_private *ast = to_ast_private(i2c->dev); -	int i; -	u8 ujcrb7, jtemp; - -	for (i = 0; i < 0x10000; i++) { -		ujcrb7 = ((clock & 0x01) ? 0 : 1); -		ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0xf4, ujcrb7); -		jtemp = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x01); -		if (ujcrb7 == jtemp) -			break; -	} -} - -static void set_data(void *i2c_priv, int data) -{ -	struct ast_i2c_chan *i2c = i2c_priv; -	struct ast_private *ast = to_ast_private(i2c->dev); -	int i; -	u8 ujcrb7, jtemp; - -	for (i = 0; i < 0x10000; i++) { -		ujcrb7 = ((data & 0x01) ? 0 : 1) << 2; -		ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0xf1, ujcrb7); -		jtemp = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x04); -		if (ujcrb7 == jtemp) -			break; -	} -} - -static struct ast_i2c_chan *ast_i2c_create(struct drm_device *dev) -{ -	struct ast_i2c_chan *i2c; -	int ret; - -	i2c = kzalloc(sizeof(struct ast_i2c_chan), GFP_KERNEL); -	if (!i2c) -		return NULL; - -	i2c->adapter.owner = THIS_MODULE; -	i2c->adapter.class = I2C_CLASS_DDC; -	i2c->adapter.dev.parent = dev->dev; -	i2c->dev = dev; -	i2c_set_adapdata(&i2c->adapter, i2c); -	snprintf(i2c->adapter.name, sizeof(i2c->adapter.name), -		 "AST i2c bit bus"); -	i2c->adapter.algo_data = &i2c->bit; - -	i2c->bit.udelay = 20; -	i2c->bit.timeout = 2; -	i2c->bit.data = i2c; -	i2c->bit.setsda = set_data; -	i2c->bit.setscl = set_clock; -	i2c->bit.getsda = get_data; -	i2c->bit.getscl = get_clock; -	ret = i2c_bit_add_bus(&i2c->adapter); -	if (ret) { -		drm_err(dev, "Failed to register bit i2c\n"); -		goto out_free; -	} - -	return i2c; -out_free: -	kfree(i2c); -	return NULL; -} - -static void ast_i2c_destroy(struct ast_i2c_chan *i2c) -{ -	if (!i2c) -		return; -	i2c_del_adapter(&i2c->adapter); -	kfree(i2c); -}  |