diff options
Diffstat (limited to 'platform/anchorage/lwis_platform_anchorage.c')
-rw-r--r-- | platform/anchorage/lwis_platform_anchorage.c | 55 |
1 files changed, 39 insertions, 16 deletions
diff --git a/platform/anchorage/lwis_platform_anchorage.c b/platform/anchorage/lwis_platform_anchorage.c index c01b8c6..36fc0ba 100644 --- a/platform/anchorage/lwis_platform_anchorage.c +++ b/platform/anchorage/lwis_platform_anchorage.c @@ -27,6 +27,7 @@ int lwis_platform_probe(struct lwis_device *lwis_dev) { struct lwis_platform *platform; + int i; if (!lwis_dev) { return -ENODEV; @@ -41,16 +42,19 @@ int lwis_platform_probe(struct lwis_device *lwis_dev) /* Enable runtime power management for the platform device */ pm_runtime_enable(&lwis_dev->plat_dev->dev); - lwis_dev->bts_index = BTS_UNSUPPORTED; /* Only IOREG devices will access DMA resources */ if (lwis_dev->type != DEVICE_TYPE_IOREG) { return 0; } + /* Register to bts */ - lwis_dev->bts_index = bts_get_bwindex(lwis_dev->name); - if (lwis_dev->bts_index < 0) { - dev_err(lwis_dev->dev, "Failed to register to BTS, ret: %d\n", lwis_dev->bts_index); - lwis_dev->bts_index = BTS_UNSUPPORTED; + for (i = 0; i < lwis_dev->bts_block_num; i++) { + lwis_dev->bts_indexes[i] = bts_get_bwindex(lwis_dev->bts_block_names[i]); + if (lwis_dev->bts_indexes[i] < 0) { + dev_err(lwis_dev->dev, "Failed to register to BTS, ret: %d\n", + lwis_dev->bts_indexes[i]); + lwis_dev->bts_indexes[i] = BTS_UNSUPPORTED; + } } return 0; @@ -100,6 +104,18 @@ static int lwis_iommu_fault_handler(struct iommu_fault *fault, void *param) #endif /* ENABLE_PAGE_FAULT_PANIC */ } +static bool lwis_device_support_bts(struct lwis_device *lwis_dev) +{ + int i; + + for (i = 0; i < lwis_dev->bts_block_num; i++) { + if (lwis_dev->bts_indexes[i] != BTS_UNSUPPORTED) { + return true; + } + } + return false; +} + int lwis_platform_device_enable(struct lwis_device *lwis_dev) { int ret; @@ -165,7 +181,7 @@ int lwis_platform_device_enable(struct lwis_device *lwis_dev) } } - if (lwis_dev->bts_scenario_name) { + if (lwis_device_support_bts(lwis_dev) && lwis_dev->bts_scenario_name) { lwis_dev->bts_scenario = bts_get_scenindex(lwis_dev->bts_scenario_name); if (!lwis_dev->bts_scenario) { dev_err(lwis_dev->dev, "Failed to get default camera BTS scenario.\n"); @@ -190,7 +206,7 @@ int lwis_platform_device_disable(struct lwis_device *lwis_dev) return -ENODEV; } - if (lwis_dev->bts_scenario_name) { + if (lwis_device_support_bts(lwis_dev) && lwis_dev->bts_scenario_name) { bts_del_scenario(lwis_dev->bts_scenario); } @@ -209,8 +225,7 @@ int lwis_platform_device_disable(struct lwis_device *lwis_dev) return pm_runtime_put_sync(&lwis_dev->plat_dev->dev); } -int lwis_platform_update_qos(struct lwis_device *lwis_dev, int value, - int32_t clock_family) +int lwis_platform_update_qos(struct lwis_device *lwis_dev, int value, int32_t clock_family) { struct lwis_platform *platform; struct exynos_pm_qos_request *qos_req; @@ -309,26 +324,34 @@ int lwis_platform_update_bts(struct lwis_device *lwis_dev, int block, unsigned i unsigned int bw_kb_read, unsigned int bw_kb_write, unsigned int bw_kb_rt) { - int ret = 0; + int ret = 0, bts_index = lwis_dev->bts_indexes[block]; + const char *block_name = lwis_dev->bts_block_names[block]; struct bts_bw bts_request; - if (lwis_dev->bts_index == BTS_UNSUPPORTED) { - dev_info(lwis_dev->dev, "%s doesn't support bts\n", lwis_dev->name); - return ret; + if (block >= lwis_dev->bts_block_num) { + dev_err(lwis_dev->dev, "Invalid block index %d, %s only has %d bts blocks\n", block, + lwis_dev->name, lwis_dev->bts_block_num); + return -EINVAL; + } + + if (bts_index == BTS_UNSUPPORTED) { + dev_err(lwis_dev->dev, "%s block %s doesn't support bts\n", lwis_dev->name, + block_name); + return -EINVAL; } bts_request.peak = bw_kb_peak; bts_request.read = bw_kb_read; bts_request.write = bw_kb_write; bts_request.rt = bw_kb_rt; - ret = bts_update_bw(lwis_dev->bts_index, bts_request); + ret = bts_update_bw(bts_index, bts_request); if (ret < 0) { dev_err(lwis_dev->dev, "Failed to update bandwidth to bts, ret: %d\n", ret); } else { dev_info( lwis_dev->dev, - "Updated bandwidth to bts for device %s: peak: %u, read: %u, write: %u, rt: %u\n", - lwis_dev->name, bw_kb_peak, bw_kb_read, bw_kb_write, bw_kb_rt); + "Updated bandwidth to bts for device %s block %s: peak: %u, read: %u, write: %u, rt: %u\n", + lwis_dev->name, block_name, bw_kb_peak, bw_kb_read, bw_kb_write, bw_kb_rt); } return ret; } |