4343#include "cdba-server.h"
4444#include "device.h"
4545#include "fastboot.h"
46- #include "console.h"
4746#include "list.h"
4847#include "ppps.h"
4948
5049#define ARRAY_SIZE (x ) ((sizeof(x)/sizeof((x)[0])))
5150
51+ #define device_has_control (_dev , _op ) \
52+ ((_dev)->control_ops && (_dev)->control_ops->_op)
53+
54+ #define device_control (_dev , _op , ...) \
55+ (_dev)->control_ops->_op((_dev) , ## __VA_ARGS__)
56+
57+ #define device_has_console (_dev , _op ) \
58+ ((_dev)->console_ops && (_dev)->console_ops->_op)
59+
60+ #define device_console (_dev , _op , ...) \
61+ (_dev)->console_ops->_op((_dev) , ## __VA_ARGS__)
62+
5263static struct list_head devices = LIST_INIT (devices );
5364
5465void device_add (struct device * device )
@@ -118,21 +129,24 @@ struct device *device_open(const char *board,
118129 return NULL ;
119130
120131found :
121- assert (device -> open || device -> console_dev );
122-
123132 if (!device_check_access (device , username ))
124133 return NULL ;
125134
135+ assert (device -> console_ops );
136+ assert (device -> console_ops -> open );
137+ assert (device -> console_ops -> write );
138+
126139 device_lock (device );
127140
128- if (device -> open ) {
129- device -> cdb = device -> open (device );
141+ if (device_has_control ( device , open ) ) {
142+ device -> cdb = device_control (device , open );
130143 if (!device -> cdb )
131144 errx (1 , "failed to open device controller" );
132145 }
133146
134- if (device -> console_dev )
135- console_open (device );
147+ device -> console = device_console (device , open );
148+ if (!device -> console )
149+ errx (1 , "failed to open device console" );
136150
137151 if (device -> usb_always_on )
138152 device_usb (device , true);
@@ -144,13 +158,13 @@ struct device *device_open(const char *board,
144158
145159static void device_impl_power (struct device * device , bool on )
146160{
147- device -> power (device , on );
161+ device_control (device , power , on );
148162}
149163
150164static void device_key (struct device * device , int key , bool asserted )
151165{
152- if (device -> key )
153- device -> key (device , key , asserted );
166+ if (device_has_control ( device , key ) )
167+ device_control (device , key , key , asserted );
154168}
155169
156170enum {
@@ -219,7 +233,7 @@ static void device_tick(void *data)
219233
220234static int device_power_on (struct device * device )
221235{
222- if (!device || !device -> power )
236+ if (!device || !device_has_control ( device , power ) )
223237 return 0 ;
224238
225239 device -> state = DEVICE_STATE_START ;
@@ -230,10 +244,10 @@ static int device_power_on(struct device *device)
230244
231245static int device_power_off (struct device * device )
232246{
233- if (!device || !device -> power )
247+ if (!device || !device_has_control ( device , power ) )
234248 return 0 ;
235249
236- device -> power (device , false);
250+ device_control (device , power , false);
237251
238252 return 0 ;
239253}
@@ -248,26 +262,24 @@ int device_power(struct device *device, bool on)
248262
249263void device_print_status (struct device * device )
250264{
251- if (device -> print_status )
252- device -> print_status (device );
265+ if (device_has_control ( device , print_status ) )
266+ device_control (device , print_status );
253267}
254268
255269void device_usb (struct device * device , bool on )
256270{
257271 if (device -> ppps_path )
258272 ppps_power (device , on );
259- else if (device -> usb )
260- device -> usb (device , on );
273+ else if (device_has_control ( device , usb ) )
274+ device_control (device , usb , on );
261275}
262276
263277int device_write (struct device * device , const void * buf , size_t len )
264278{
265279 if (!device )
266280 return 0 ;
267281
268- assert (device -> write );
269-
270- return device -> write (device , buf , len );
282+ return device_console (device , write , buf , len );
271283}
272284
273285void device_fastboot_boot (struct device * device )
@@ -292,8 +304,8 @@ void device_boot(struct device *device, const void *data, size_t len)
292304
293305void device_send_break (struct device * device )
294306{
295- if (device -> send_break )
296- device -> send_break (device );
307+ if (device_has_console ( device , send_break ) )
308+ device_console (device , send_break );
297309}
298310
299311void device_list_devices (const char * username )
@@ -346,6 +358,6 @@ void device_close(struct device *dev)
346358 device_usb (dev , false);
347359 device_power (dev , false);
348360
349- if (dev -> close )
350- dev -> close (dev );
361+ if (device_has_control ( dev , close ) )
362+ device_control (dev , close );
351363}
0 commit comments