diff mbox series

[01/13] drm/ast: Move I2C code within ast_mode.c

Message ID 20200728074425.2749-2-tzimmermann@suse.de (mailing list archive)
State New, archived
Headers show
Series drm/ast: Convert to managed initialization | expand

Commit Message

Thomas Zimmermann July 28, 2020, 7:44 a.m. UTC
The I2C support feels slammed down to the end of ast_mode.c. Improve
this by moving the code before it's callers, remove the declarations,
rename the callbacks to match I2C's get/set sda/scl convention, and
prefix all functions with ast_. No functional changes have been made.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/ast/ast_mode.c | 249 +++++++++++++++++----------------
 1 file changed, 125 insertions(+), 124 deletions(-)

Comments

Sam Ravnborg July 28, 2020, 6:04 p.m. UTC | #1
Hi Thomas.

A few comments related to the code - but not to this patch and
not to this patch-set.
But I noticed so here goes.

	Sam

On Tue, Jul 28, 2020 at 09:44:13AM +0200, Thomas Zimmermann wrote:
> The I2C support feels slammed down to the end of ast_mode.c. Improve
> this by moving the code before it's callers, remove the declarations,
> rename the callbacks to match I2C's get/set sda/scl convention, and
> prefix all functions with ast_. No functional changes have been made.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
>  drivers/gpu/drm/ast/ast_mode.c | 249 +++++++++++++++++----------------
>  1 file changed, 125 insertions(+), 124 deletions(-)
> 
> diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
> index 154cd877d9d1..19f1dfc8e9e0 100644
> --- a/drivers/gpu/drm/ast/ast_mode.c
> +++ b/drivers/gpu/drm/ast/ast_mode.c
> @@ -46,9 +46,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)
> @@ -514,6 +511,131 @@ static void ast_set_start_address_crt1(struct ast_private *ast,
>  
>  }
>  
> +/*
> + * I2C
> + */
> +
> +static int ast_i2c_getscl(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;
s/uint32_t/u32

> +
> +	count = 0;
> +	pass = 0;
> +	val = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x10) >> 4) & 0x01;
So val is a bool - but anyway an int is used.

> +	do {
> +		val2 = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x10) >> 4) & 0x01;
Likewise for val2.

> +		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;
bool to int conversion could do the trick here.

> +}
> +
> +static int ast_i2c_getsda(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 ast_i2c_setscl(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;
And now u8 is used for registers.
Maybe because ast_get_index_reg_mask() returns uint8_t.

So for consistentcy do the uint8_t => u8 etc. conversion first.

> +
> +	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 ast_i2c_setsda(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->pdev->dev;
> +	i2c->dev = dev;
> +	i2c_set_adapdata(&i2c->adapter, i2c);
If ast_private * was passed here and not i2c.
Then the implementation of ast_i2c_* could be a tad simpler - no
upclassing needed.
And then you could drop the drm_device field.
(And would need to invent another way to check if i2c is initialized).


> +	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 = ast_i2c_setsda;
> +	i2c->bit.setscl = ast_i2c_setscl;
> +	i2c->bit.getsda = ast_i2c_getsda;
> +	i2c->bit.getscl = ast_i2c_getscl;
> +	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);
> +}
> +
>  /*
>   * Primary plane
>   */
> @@ -1146,124 +1268,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->pdev->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);
> -}
> -- 
> 2.27.0
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
Thomas Zimmermann July 30, 2020, 9:18 a.m. UTC | #2
Hi

Am 28.07.20 um 20:04 schrieb Sam Ravnborg:
> Hi Thomas.
> 
> A few comments related to the code - but not to this patch and
> not to this patch-set.
> But I noticed so here goes.

You're right on these points. But it's worth a separate patchset. I
really just move code around here.

Best regards
Thomas

> 
> 	Sam
> 
> On Tue, Jul 28, 2020 at 09:44:13AM +0200, Thomas Zimmermann wrote:
>> The I2C support feels slammed down to the end of ast_mode.c. Improve
>> this by moving the code before it's callers, remove the declarations,
>> rename the callbacks to match I2C's get/set sda/scl convention, and
>> prefix all functions with ast_. No functional changes have been made.
>>
>> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
>> ---
>>  drivers/gpu/drm/ast/ast_mode.c | 249 +++++++++++++++++----------------
>>  1 file changed, 125 insertions(+), 124 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
>> index 154cd877d9d1..19f1dfc8e9e0 100644
>> --- a/drivers/gpu/drm/ast/ast_mode.c
>> +++ b/drivers/gpu/drm/ast/ast_mode.c
>> @@ -46,9 +46,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)
>> @@ -514,6 +511,131 @@ static void ast_set_start_address_crt1(struct ast_private *ast,
>>  
>>  }
>>  
>> +/*
>> + * I2C
>> + */
>> +
>> +static int ast_i2c_getscl(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;
> s/uint32_t/u32
> 
>> +
>> +	count = 0;
>> +	pass = 0;
>> +	val = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x10) >> 4) & 0x01;
> So val is a bool - but anyway an int is used.
> 
>> +	do {
>> +		val2 = (ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb7, 0x10) >> 4) & 0x01;
> Likewise for val2.
> 
>> +		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;
> bool to int conversion could do the trick here.
> 
>> +}
>> +
>> +static int ast_i2c_getsda(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 ast_i2c_setscl(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;
> And now u8 is used for registers.
> Maybe because ast_get_index_reg_mask() returns uint8_t.
> 
> So for consistentcy do the uint8_t => u8 etc. conversion first.
> 
>> +
>> +	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 ast_i2c_setsda(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->pdev->dev;
>> +	i2c->dev = dev;
>> +	i2c_set_adapdata(&i2c->adapter, i2c);
> If ast_private * was passed here and not i2c.
> Then the implementation of ast_i2c_* could be a tad simpler - no
> upclassing needed.
> And then you could drop the drm_device field.
> (And would need to invent another way to check if i2c is initialized).
> 
> 
>> +	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 = ast_i2c_setsda;
>> +	i2c->bit.setscl = ast_i2c_setscl;
>> +	i2c->bit.getsda = ast_i2c_getsda;
>> +	i2c->bit.getscl = ast_i2c_getscl;
>> +	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);
>> +}
>> +
>>  /*
>>   * Primary plane
>>   */
>> @@ -1146,124 +1268,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->pdev->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);
>> -}
>> -- 
>> 2.27.0
>>
>> _______________________________________________
>> dri-devel mailing list
>> dri-devel@lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/dri-devel
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
index 154cd877d9d1..19f1dfc8e9e0 100644
--- a/drivers/gpu/drm/ast/ast_mode.c
+++ b/drivers/gpu/drm/ast/ast_mode.c
@@ -46,9 +46,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)
@@ -514,6 +511,131 @@  static void ast_set_start_address_crt1(struct ast_private *ast,
 
 }
 
+/*
+ * I2C
+ */
+
+static int ast_i2c_getscl(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 ast_i2c_getsda(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 ast_i2c_setscl(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 ast_i2c_setsda(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->pdev->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 = ast_i2c_setsda;
+	i2c->bit.setscl = ast_i2c_setscl;
+	i2c->bit.getsda = ast_i2c_getsda;
+	i2c->bit.getscl = ast_i2c_getscl;
+	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);
+}
+
 /*
  * Primary plane
  */
@@ -1146,124 +1268,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->pdev->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);
-}