1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Silicon Labs C2 port Linux support 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (c) 2007 Rodolfo Giometti <giometti@linux.it> 6*4882a593Smuzhiyun * Copyright (c) 2007 Eurotech S.p.A. <info@eurotech.it> 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #define C2PORT_NAME_LEN 32 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun struct device; 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* 14*4882a593Smuzhiyun * C2 port basic structs 15*4882a593Smuzhiyun */ 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun /* Main struct */ 18*4882a593Smuzhiyun struct c2port_ops; 19*4882a593Smuzhiyun struct c2port_device { 20*4882a593Smuzhiyun unsigned int access:1; 21*4882a593Smuzhiyun unsigned int flash_access:1; 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun int id; 24*4882a593Smuzhiyun char name[C2PORT_NAME_LEN]; 25*4882a593Smuzhiyun struct c2port_ops *ops; 26*4882a593Smuzhiyun struct mutex mutex; /* prevent races during read/write */ 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun struct device *dev; 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun void *private_data; 31*4882a593Smuzhiyun }; 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /* Basic operations */ 34*4882a593Smuzhiyun struct c2port_ops { 35*4882a593Smuzhiyun /* Flash layout */ 36*4882a593Smuzhiyun unsigned short block_size; /* flash block size in bytes */ 37*4882a593Smuzhiyun unsigned short blocks_num; /* flash blocks number */ 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun /* Enable or disable the access to C2 port */ 40*4882a593Smuzhiyun void (*access)(struct c2port_device *dev, int status); 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun /* Set C2D data line as input/output */ 43*4882a593Smuzhiyun void (*c2d_dir)(struct c2port_device *dev, int dir); 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun /* Read/write C2D data line */ 46*4882a593Smuzhiyun int (*c2d_get)(struct c2port_device *dev); 47*4882a593Smuzhiyun void (*c2d_set)(struct c2port_device *dev, int status); 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun /* Write C2CK clock line */ 50*4882a593Smuzhiyun void (*c2ck_set)(struct c2port_device *dev, int status); 51*4882a593Smuzhiyun }; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun /* 54*4882a593Smuzhiyun * Exported functions 55*4882a593Smuzhiyun */ 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun extern struct c2port_device *c2port_device_register(char *name, 58*4882a593Smuzhiyun struct c2port_ops *ops, void *devdata); 59*4882a593Smuzhiyun extern void c2port_device_unregister(struct c2port_device *dev); 60