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/device.h> 13 #include <linux/kmemcheck.h> 14 15 #define C2PORT_NAME_LEN 32 16 17 /* 18 * C2 port basic structs 19 */ 20 21 /* Main struct */ 22 struct c2port_ops; 23 struct c2port_device { 24 kmemcheck_bitfield_begin(flags); 25 unsigned int access:1; 26 unsigned int flash_access:1; 27 kmemcheck_bitfield_end(flags); 28 29 int id; 30 char name[C2PORT_NAME_LEN]; 31 struct c2port_ops *ops; 32 struct mutex mutex; /* prevent races during read/write */ 33 34 struct device *dev; 35 36 void *private_data; 37 }; 38 39 /* Basic operations */ 40 struct c2port_ops { 41 /* Flash layout */ 42 unsigned short block_size; /* flash block size in bytes */ 43 unsigned short blocks_num; /* flash blocks number */ 44 45 /* Enable or disable the access to C2 port */ 46 void (*access)(struct c2port_device *dev, int status); 47 48 /* Set C2D data line as input/output */ 49 void (*c2d_dir)(struct c2port_device *dev, int dir); 50 51 /* Read/write C2D data line */ 52 int (*c2d_get)(struct c2port_device *dev); 53 void (*c2d_set)(struct c2port_device *dev, int status); 54 55 /* Write C2CK clock line */ 56 void (*c2ck_set)(struct c2port_device *dev, int status); 57 }; 58 59 /* 60 * Exported functions 61 */ 62 63 #define to_class_dev(obj) container_of((obj), struct class_device, kobj) 64 #define to_c2port_device(obj) container_of((obj), struct c2port_device, class) 65 66 extern struct c2port_device *c2port_device_register(char *name, 67 struct c2port_ops *ops, void *devdata); 68 extern void c2port_device_unregister(struct c2port_device *dev); 69