summaryrefslogtreecommitdiff
path: root/platform/anchorage/lwis_platform_anchorage.c
diff options
context:
space:
mode:
Diffstat (limited to 'platform/anchorage/lwis_platform_anchorage.c')
-rw-r--r--platform/anchorage/lwis_platform_anchorage.c55
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;
}