1 /* 2 * Silicon Labs C2 port Linux support 3 * 4 * Copyright (c) 2007 Rodolfo Giometti <giometti@linux.it> 5 * Copyright (c) 2007 Eurotech S.p.A. <info@eurotech.it> 6 * 7 * This program is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License version 2 as published by 9 * the Free Software Foundation 10 */ 11 12 #include <linux/kmemcheck.h> 13 14 #define C2PORT_NAME_LEN 32 15 16 struct device; 17 18 /* 19 * C2 port basic structs 20 */ 21 22 /* Main struct */ 23 struct c2port_ops; 24 struct c2port_device { 25 kmemcheck_bitfield_begin(flags); 26 unsigned int access:1; 27 unsigned int flash_access:1; 28 kmemcheck_bitfield_end(flags); 29 30 int id; 31 char name[C2PORT_NAME_LEN]; 32 struct c2port_ops *ops; 33 struct mutex mutex; /* prevent races during read/write */ 34 35 struct device *dev; 36 37 void *private_data; 38 }; 39 40 /* Basic operations */ 41 struct c2port_ops { 42 /* Flash layout */ 43 unsigned short block_size; /* flash block size in bytes */ 44 unsigned short blocks_num; /* flash blocks number */ 45 46 /* Enable or disable the access to C2 port */ 47 void (*access)(struct c2port_device *dev, int status); 48 49 /* Set C2D data line as input/output */ 50 void (*c2d_dir)(struct c2port_device *dev, int dir); 51 52 /* Read/write C2D data line */ 53 int (*c2d_get)(struct c2port_device *dev); 54 void (*c2d_set)(struct c2port_device *dev, int status); 55 56 /* Write C2CK clock line */ 57 void (*c2ck_set)(struct c2port_device *dev, int status); 58 }; 59 60 /* 61 * Exported functions 62 */ 63 64 extern struct c2port_device *c2port_device_register(char *name, 65 struct c2port_ops *ops, void *devdata); 66 extern void c2port_device_unregister(struct c2port_device *dev); 67