/** * buffer_icap_device_write - Transfer bytes from ICAP to the storage buffer. * @drvdata: a pointer to the drvdata. * @offset: The storage buffer start address. * @count: The number of words (32 bit) to read from the * device (ICAP). **/ static int buffer_icap_device_write(struct hwicap_drvdata *drvdata, u32 offset, u32 count) { s32 retries = 0; void __iomem *base_address = drvdata->base_address; if (buffer_icap_busy(base_address)) return -EBUSY; if ((offset + count) > XHI_MAX_BUFFER_INTS) return -EINVAL; /* setSize count*4 to get bytes. */ buffer_icap_set_size(base_address, count << 2); buffer_icap_set_offset(base_address, offset); buffer_icap_set_rnc(base_address, XHI_CONFIGURE); while (buffer_icap_busy(base_address)) { retries++; if (retries > XHI_MAX_RETRIES) return -EBUSY; } return 0; };
static int buffer_icap_device_read(struct hwicap_drvdata *drvdata, u32 offset, u32 count) { s32 retries = 0; void __iomem *base_address = drvdata->base_address; if (buffer_icap_busy(base_address)) return -EBUSY; if ((offset + count) > XHI_MAX_BUFFER_INTS) return -EINVAL; buffer_icap_set_size(base_address, (count << 2)); buffer_icap_set_offset(base_address, offset); buffer_icap_set_rnc(base_address, XHI_READBACK); while (buffer_icap_busy(base_address)) { retries++; if (retries > XHI_MAX_RETRIES) return -EBUSY; } return 0; };