aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/westbridge/astoria/api/src/cyasstorage.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/westbridge/astoria/api/src/cyasstorage.c')
-rwxr-xr-x[-rw-r--r--]drivers/staging/westbridge/astoria/api/src/cyasstorage.c96
1 files changed, 91 insertions, 5 deletions
diff --git a/drivers/staging/westbridge/astoria/api/src/cyasstorage.c b/drivers/staging/westbridge/astoria/api/src/cyasstorage.c
index 7abd6a3..413c7f9 100644..100755
--- a/drivers/staging/westbridge/astoria/api/src/cyasstorage.c
+++ b/drivers/staging/westbridge/astoria/api/src/cyasstorage.c
@@ -1383,11 +1383,19 @@ my_storage_query_unit(cy_as_device *dev_p,
if (req_p == 0)
return CY_AS_ERROR_OUT_OF_MEMORY;
- if (device > 255)
+ if (device > 255) {
+#if defined(CONFIG_MACH_U1_NA_SPR) || defined(CONFIG_MACH_U1_NA_USCC)
+ cy_as_ll_destroy_request(dev_p, req_p) ;
+#endif
return CY_AS_ERROR_NO_SUCH_DEVICE;
+ }
- if (unit > 255)
+ if (unit > 255) {
+#if defined(CONFIG_MACH_U1_NA_SPR) || defined(CONFIG_MACH_U1_NA_USCC)
+ cy_as_ll_destroy_request(dev_p, req_p) ;
+#endif
return CY_AS_ERROR_NO_SUCH_UNIT;
+ }
cy_as_ll_request_response__set_word(req_p, 0,
create_address(bus, device, (uint8_t)unit));
@@ -2041,13 +2049,13 @@ cy_as_storage_sync_oper(cy_as_device *dev_p,
/* Setup the DMA request */
ctxt_p = dev_p->context[CY_RQT_STORAGE_RQT_CONTEXT];
ret = cy_as_dma_drain_queue(dev_p, ep, cy_false);
-
+ if (ret == CY_AS_ERROR_SUCCESS) {
while (loopcount-- > 0) {
if (dev_p->storage_wait == cy_false)
break;
cy_as_hal_sleep_on(&ctxt_p->channel, 10);
}
-
+ }
if (dev_p->storage_wait == cy_true) {
dev_p->storage_wait = cy_false;
cy_as_ll_remove_request(dev_p, ctxt_p, req_p, cy_true);
@@ -2829,6 +2837,9 @@ cy_as_storage_func_callback(cy_as_device *dev_p,
ret = CY_AS_ERROR_NOT_SUPPORTED;
break;
+ case CY_RQT_CHANGE_SD_FREQ:
+ ret = my_handle_response_no_data(dev_p, rqt, resp) ;
+ break ;
default:
ret = CY_AS_ERROR_INVALID_RESPONSE;
@@ -2912,7 +2923,7 @@ cy_as_sdio_device_check(
if (!cy_as_device_is_astoria_dev(dev_p))
return CY_AS_ERROR_NOT_SUPPORTED;
- return (is_storage_active(dev_p));
+ return is_storage_active(dev_p);
}
cy_as_return_status_t
@@ -4121,5 +4132,80 @@ cy_as_sdio_de_init_function(
return CY_AS_ERROR_SUCCESS;
}
+cy_as_return_status_t
+cy_as_storage_change_sd_frequency(
+ cy_as_device_handle handle,
+ cy_as_bus_number_t bus,
+ uint8_t clk_source,
+ uint8_t clk_divider,
+ cy_as_function_callback cb,
+ uint32_t client)
+{
+ cy_as_ll_request_response *req_p, *reply_p ;
+ cy_as_return_status_t ret = CY_AS_ERROR_SUCCESS ;
+ cy_as_device *dev_p = (cy_as_device *)handle ;
+
+ if (!dev_p || (dev_p->sig != CY_AS_DEVICE_HANDLE_SIGNATURE))
+ return CY_AS_ERROR_INVALID_HANDLE ;
+
+ ret = is_storage_active(dev_p) ;
+ if (ret != CY_AS_ERROR_SUCCESS)
+ return ret ;
+
+ if (bus < 0 || bus >= CY_AS_MAX_BUSES)
+ return CY_AS_ERROR_NO_SUCH_BUS ;
+
+ /* If SD is not supported on the specified bus, then return ERROR */
+ if (dev_p->storage_device_info[bus][0].type != cy_as_media_sd_flash)
+ return CY_AS_ERROR_NOT_SUPPORTED;
+
+ /* Create the request to send to the West Bridge device */
+ req_p = cy_as_ll_create_request(dev_p, CY_RQT_CHANGE_SD_FREQ,
+ CY_RQT_STORAGE_RQT_CONTEXT, 2) ;
+
+ if (req_p == 0)
+ return CY_AS_ERROR_OUT_OF_MEMORY ;
+
+
+ /* Reserve space for the reply, the reply data will not
+ exceed four words. */
+ reply_p = cy_as_ll_create_response(dev_p, 4) ;
+ if (reply_p == 0) {
+ cy_as_ll_destroy_request(dev_p, req_p) ;
+ return CY_AS_ERROR_OUT_OF_MEMORY ;
+ }
+
+ cy_as_ll_request_response__set_word(req_p, 0,
+ create_address(bus, 0, 0)) ;
+ cy_as_ll_request_response__set_word(req_p, 1,
+ (((uint16_t)clk_divider << 8) | (clk_source))) ;
+
+ if (cb == 0) {
+ ret = cy_as_ll_send_request_wait_reply(dev_p, req_p, reply_p) ;
+ if (ret != CY_AS_ERROR_SUCCESS)
+ goto destroy ;
+
+ ret = my_handle_response_no_data(dev_p, req_p, reply_p) ;
+ return ret ;
+ } else {
+ ret = cy_as_misc_send_request(dev_p, cb, client,
+ CY_FUNCT_CB_STOR_CHANGE_SD_FREQ, 0,
+ dev_p->func_cbs_stor, CY_AS_REQUEST_RESPONSE_EX,
+ req_p, reply_p, cy_as_storage_func_callback) ;
+
+ if (ret != CY_AS_ERROR_SUCCESS)
+ goto destroy ;
+
+ /* The request and response
+ are freed as part of the FuncCallback */
+ return ret ;
+ }
+
+destroy:
+ cy_as_ll_destroy_request(dev_p, req_p) ;
+ cy_as_ll_destroy_response(dev_p, reply_p) ;
+
+ return ret ;
+}
/*[]*/