Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drivers/fsi: expose direct-access slave API

Allow drivers to access the slave address ranges.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Joel Stanley <joel@jms.id.au>
Signed-off-by: Christopher Bostic <cbostic@linux.vnet.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Jeremy Kerr and committed by
Greg Kroah-Hartman
da36cadf 125739cb

+36 -6
+24 -6
drivers/fsi/fsi-core.c
··· 78 78 uint8_t slave_id, uint32_t addr, void *val, size_t size); 79 79 static int fsi_master_write(struct fsi_master *master, int link, 80 80 uint8_t slave_id, uint32_t addr, const void *val, size_t size); 81 - static int fsi_slave_read(struct fsi_slave *slave, uint32_t addr, 82 - void *val, size_t size); 83 - static int fsi_slave_write(struct fsi_slave *slave, uint32_t addr, 84 - const void *val, size_t size); 85 81 86 82 /* 87 83 * fsi_device_read() / fsi_device_write() / fsi_device_peek() ··· 170 174 return 0; 171 175 } 172 176 173 - static int fsi_slave_read(struct fsi_slave *slave, uint32_t addr, 177 + int fsi_slave_read(struct fsi_slave *slave, uint32_t addr, 174 178 void *val, size_t size) 175 179 { 176 180 uint8_t id = slave->id; ··· 183 187 return fsi_master_read(slave->master, slave->link, id, 184 188 addr, val, size); 185 189 } 190 + EXPORT_SYMBOL_GPL(fsi_slave_read); 186 191 187 - static int fsi_slave_write(struct fsi_slave *slave, uint32_t addr, 192 + int fsi_slave_write(struct fsi_slave *slave, uint32_t addr, 188 193 const void *val, size_t size) 189 194 { 190 195 uint8_t id = slave->id; ··· 198 201 return fsi_master_write(slave->master, slave->link, id, 199 202 addr, val, size); 200 203 } 204 + EXPORT_SYMBOL_GPL(fsi_slave_write); 205 + 206 + extern int fsi_slave_claim_range(struct fsi_slave *slave, 207 + uint32_t addr, uint32_t size) 208 + { 209 + if (addr + size < addr) 210 + return -EINVAL; 211 + 212 + if (addr + size > slave->size) 213 + return -EINVAL; 214 + 215 + /* todo: check for overlapping claims */ 216 + return 0; 217 + } 218 + EXPORT_SYMBOL_GPL(fsi_slave_claim_range); 219 + 220 + extern void fsi_slave_release_range(struct fsi_slave *slave, 221 + uint32_t addr, uint32_t size) 222 + { 223 + } 224 + EXPORT_SYMBOL_GPL(fsi_slave_release_range); 201 225 202 226 static int fsi_slave_scan(struct fsi_slave *slave) 203 227 {
+12
include/linux/fsi.h
··· 66 66 module_driver(__fsi_driver, fsi_driver_register, \ 67 67 fsi_driver_unregister) 68 68 69 + /* direct slave API */ 70 + extern int fsi_slave_claim_range(struct fsi_slave *slave, 71 + uint32_t addr, uint32_t size); 72 + extern void fsi_slave_release_range(struct fsi_slave *slave, 73 + uint32_t addr, uint32_t size); 74 + extern int fsi_slave_read(struct fsi_slave *slave, uint32_t addr, 75 + void *val, size_t size); 76 + extern int fsi_slave_write(struct fsi_slave *slave, uint32_t addr, 77 + const void *val, size_t size); 78 + 79 + 80 + 69 81 extern struct bus_type fsi_bus_type; 70 82 71 83 #endif /* LINUX_FSI_H */