diff options
Diffstat (limited to 'drivers/staging/westbridge/astoria/api/src/cyasstorage.c')
-rwxr-xr-x[-rw-r--r--] | drivers/staging/westbridge/astoria/api/src/cyasstorage.c | 96 |
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 ; +} /*[]*/ |