2424#include <drm/drm_managed.h>
2525#include <drm/drm_print.h>
2626
27+ #include "ast_ddc.h"
2728#include "ast_drv.h"
2829
29- static void ast_i2c_setsda (void * i2c_priv , int data )
30+ static void ast_ddc_algo_bit_data_setsda (void * data , int state )
3031{
31- struct ast_i2c_chan * i2c = i2c_priv ;
32- struct ast_device * ast = to_ast_device ( i2c -> dev ) ;
32+ struct ast_ddc * ddc = data ;
33+ struct ast_device * ast = ddc -> ast ;
3334 int i ;
3435 u8 ujcrb7 , jtemp ;
3536
3637 for (i = 0 ; i < 0x10000 ; i ++ ) {
37- ujcrb7 = ((data & 0x01 ) ? 0 : 1 ) << 2 ;
38+ ujcrb7 = ((state & 0x01 ) ? 0 : 1 ) << 2 ;
3839 ast_set_index_reg_mask (ast , AST_IO_VGACRI , 0xb7 , 0xf1 , ujcrb7 );
3940 jtemp = ast_get_index_reg_mask (ast , AST_IO_VGACRI , 0xb7 , 0x04 );
4041 if (ujcrb7 == jtemp )
4142 break ;
4243 }
4344}
4445
45- static void ast_i2c_setscl (void * i2c_priv , int clock )
46+ static void ast_ddc_algo_bit_data_setscl (void * data , int state )
4647{
47- struct ast_i2c_chan * i2c = i2c_priv ;
48- struct ast_device * ast = to_ast_device ( i2c -> dev ) ;
48+ struct ast_ddc * ddc = data ;
49+ struct ast_device * ast = ddc -> ast ;
4950 int i ;
5051 u8 ujcrb7 , jtemp ;
5152
5253 for (i = 0 ; i < 0x10000 ; i ++ ) {
53- ujcrb7 = ((clock & 0x01 ) ? 0 : 1 );
54+ ujcrb7 = ((state & 0x01 ) ? 0 : 1 );
5455 ast_set_index_reg_mask (ast , AST_IO_VGACRI , 0xb7 , 0xf4 , ujcrb7 );
5556 jtemp = ast_get_index_reg_mask (ast , AST_IO_VGACRI , 0xb7 , 0x01 );
5657 if (ujcrb7 == jtemp )
5758 break ;
5859 }
5960}
6061
61- static int ast_i2c_getsda ( void * i2c_priv )
62+ static int ast_ddc_algo_bit_data_pre_xfer ( struct i2c_adapter * adapter )
6263{
63- struct ast_i2c_chan * i2c = i2c_priv ;
64- struct ast_device * ast = to_ast_device (i2c -> dev );
64+ struct ast_ddc * ddc = i2c_get_adapdata (adapter );
65+ struct ast_device * ast = ddc -> ast ;
66+
67+ /*
68+ * Protect access to I/O registers from concurrent modesetting
69+ * by acquiring the I/O-register lock.
70+ */
71+ mutex_lock (& ast -> modeset_lock );
72+
73+ return 0 ;
74+ }
75+
76+ static void ast_ddc_algo_bit_data_post_xfer (struct i2c_adapter * adapter )
77+ {
78+ struct ast_ddc * ddc = i2c_get_adapdata (adapter );
79+ struct ast_device * ast = ddc -> ast ;
80+
81+ mutex_unlock (& ast -> modeset_lock );
82+ }
83+
84+ static int ast_ddc_algo_bit_data_getsda (void * data )
85+ {
86+ struct ast_ddc * ddc = data ;
87+ struct ast_device * ast = ddc -> ast ;
6588 uint32_t val , val2 , count , pass ;
6689
6790 count = 0 ;
@@ -80,10 +103,10 @@ static int ast_i2c_getsda(void *i2c_priv)
80103 return val & 1 ? 1 : 0 ;
81104}
82105
83- static int ast_i2c_getscl (void * i2c_priv )
106+ static int ast_ddc_algo_bit_data_getscl (void * data )
84107{
85- struct ast_i2c_chan * i2c = i2c_priv ;
86- struct ast_device * ast = to_ast_device ( i2c -> dev ) ;
108+ struct ast_ddc * ddc = data ;
109+ struct ast_device * ast = ddc -> ast ;
87110 uint32_t val , val2 , count , pass ;
88111
89112 count = 0 ;
@@ -102,50 +125,53 @@ static int ast_i2c_getscl(void *i2c_priv)
102125 return val & 1 ? 1 : 0 ;
103126}
104127
105- static void ast_i2c_release (struct drm_device * dev , void * res )
128+ static void ast_ddc_release (struct drm_device * dev , void * res )
106129{
107- struct ast_i2c_chan * i2c = res ;
130+ struct ast_ddc * ddc = res ;
108131
109- i2c_del_adapter (& i2c -> adapter );
110- kfree (i2c );
132+ i2c_del_adapter (& ddc -> adapter );
111133}
112134
113- struct ast_i2c_chan * ast_i2c_create (struct drm_device * dev )
135+ struct ast_ddc * ast_ddc_create (struct ast_device * ast )
114136{
115- struct ast_i2c_chan * i2c ;
137+ struct drm_device * dev = & ast -> base ;
138+ struct ast_ddc * ddc ;
139+ struct i2c_adapter * adapter ;
140+ struct i2c_algo_bit_data * bit ;
116141 int ret ;
117142
118- i2c = kzalloc (sizeof (struct ast_i2c_chan ), GFP_KERNEL );
119- if (!i2c )
120- return NULL ;
121-
122- i2c -> adapter .owner = THIS_MODULE ;
123- i2c -> adapter .dev .parent = dev -> dev ;
124- i2c -> dev = dev ;
125- i2c_set_adapdata (& i2c -> adapter , i2c );
126- snprintf (i2c -> adapter .name , sizeof (i2c -> adapter .name ),
127- "AST i2c bit bus" );
128- i2c -> adapter .algo_data = & i2c -> bit ;
129-
130- i2c -> bit .udelay = 20 ;
131- i2c -> bit .timeout = 2 ;
132- i2c -> bit .data = i2c ;
133- i2c -> bit .setsda = ast_i2c_setsda ;
134- i2c -> bit .setscl = ast_i2c_setscl ;
135- i2c -> bit .getsda = ast_i2c_getsda ;
136- i2c -> bit .getscl = ast_i2c_getscl ;
137- ret = i2c_bit_add_bus (& i2c -> adapter );
143+ ddc = drmm_kzalloc (dev , sizeof (* ddc ), GFP_KERNEL );
144+ if (!ddc )
145+ return ERR_PTR (- ENOMEM );
146+ ddc -> ast = ast ;
147+
148+ adapter = & ddc -> adapter ;
149+ adapter -> owner = THIS_MODULE ;
150+ adapter -> dev .parent = dev -> dev ;
151+ i2c_set_adapdata (adapter , ddc );
152+ snprintf (adapter -> name , sizeof (adapter -> name ), "AST DDC bus" );
153+
154+ bit = & ddc -> bit ;
155+ bit -> udelay = 20 ;
156+ bit -> timeout = 2 ;
157+ bit -> data = ddc ;
158+ bit -> setsda = ast_ddc_algo_bit_data_setsda ;
159+ bit -> setscl = ast_ddc_algo_bit_data_setscl ;
160+ bit -> getsda = ast_ddc_algo_bit_data_getsda ;
161+ bit -> getscl = ast_ddc_algo_bit_data_getscl ;
162+ bit -> pre_xfer = ast_ddc_algo_bit_data_pre_xfer ;
163+ bit -> post_xfer = ast_ddc_algo_bit_data_post_xfer ;
164+
165+ adapter -> algo_data = bit ;
166+ ret = i2c_bit_add_bus (adapter );
138167 if (ret ) {
139168 drm_err (dev , "Failed to register bit i2c\n" );
140- goto out_kfree ;
169+ return ERR_PTR ( ret ) ;
141170 }
142171
143- ret = drmm_add_action_or_reset (dev , ast_i2c_release , i2c );
172+ ret = drmm_add_action_or_reset (dev , ast_ddc_release , ddc );
144173 if (ret )
145- return NULL ;
146- return i2c ;
174+ return ERR_PTR (ret );
147175
148- out_kfree :
149- kfree (i2c );
150- return NULL ;
176+ return ddc ;
151177}
0 commit comments