frsh_SOURCES = frsh_contract.c frsh_vres.c frsh_synchobj.c frsh_distributed.c frsh_core.c \
frsh_spare_capacity.c frsh_error.c frsh_thread.c frsh_sharedobj.c frsh_power.c frsh_feedback.c
include_HEADERS = frsh_opaque_types.h frsh_forb.h
-frsh_LIBS = fna fcb_client forb contract synchobj sharedobj acpi_cpu acpi_lcd fra ulut fosa $(allocator-libs-y)
+frsh_LIBS = fna fcb_client forb contract synchobj sharedobj fra ulut fosa $(allocator-libs-y) $(platform-libs-y)
config_include_HEADERS = frsh_resources.h
frsh_resources_DEFINES = CONFIG_RESOURCE_DUMMY \
CONFIG_CPUCG\
CONFIG_DISKBFQ\
CONFIG_FWP \
- CONFIG_RESOURCE_ITEM
+ CONFIG_RESOURCE_ITEM \
+ CONFIG_ACPI_LCD \
+ CONFIG_ACPI_CPU
allocator-libs-$(CONFIG_RESOURCE_DUMMY) += fra_dummy
allocator-libs-$(CONFIG_RESOURCE_ITEM) += fra_item
allocator-libs-$(CONFIG_CPUCG) += frshcpucg
allocator-libs-$(CONFIG_DISKBFQ) += frshdiskbfq
+platform-libs-$(CONFIG_ACPI_CPU) += acpi_cpu
+platform-libs-$(CONFIG_ACPI_LCD) += acpi_lcd
+
ifneq ($(AQUOSA_ROOT),)
LOADLIBES += -L $(AQUOSA_ROOT)/lib
LDFLAGS += -L $(AQUOSA_ROOT)/lib
#include <fcb.h>
#include <fra_generic.h>
#include <frsh_forb.h>
-#include <fra_acpi_cpu.h>
-#include <fra_acpi_lcd.h>
+#include "frsh_resources.h"
+#ifdef CONFIG_ACPI_CPU
+# include <fra_acpi_cpu.h>
+#endif
+#ifdef CONFIG_ACPI_LCD
+# include <fra_acpi_lcd.h>
+#endif
#include <frsh.h>
static inline int __is_a_valid_power(level)
return FRSH_ERR_NOT_IMPLEMENTED;;
}
+/* FIXME: What happens when one application set one power-level and
+ * second application different level. I think this function should
+ * not be part of API. It should be used internally (e.g. by contract
+ * broker) to achieve the requirements specified by
+ * frsh_contract_set_min_expiration() and similar functions.
+ *
+ * This implementation also skips FCB when doing changes to resources,
+ * which is certainly not good, because resource manager does not know
+ * about the change.
+ */
int frsh_resource_set_power_level
(frsh_resource_type_t resource_type,
frsh_resource_id_t resource_id,
frsh_power_level_t power_level)
{
- int ret;
switch(resource_type)
{
+#ifdef CONFIG_ACPI_CPU
case FRSH_RT_PROCESSOR:
{
+ int ret;
ret = fra_CPU_frequency_init(resource_id);
- if (ret) goto err;
+ if (ret) return FRSH_ERR_INTERNAL_ERROR;
ret = fra_CPU_set_frequency(resource_id, power_level);
- if (ret) goto err;
+ if (ret) return FRSH_ERR_INTERNAL_ERROR;
/**
* @TODO:
* if (i budget sono effettivamente diversi)
* rinegozia i contratti coi nuovi valori
**/
-
break;
}
+#endif
+#ifdef CONFIG_ACPI_LCD
case FRSH_RT_LCD:
{
+ int ret;
ret = fra_LCD_brightness_init(resource_id);
- if (ret) goto err;
+ if (ret) return FRSH_ERR_INTERNAL_ERROR;
ret = fra_LCD_set_brightness(resource_id, power_level);
- if (ret) goto err;
-
+ if (ret) return FRSH_ERR_INTERNAL_ERROR;
break;
}
+#endif
default:
return FRSH_ERR_NOT_IMPLEMENTED;
}
return FRSH_NO_ERROR;
-err:
- return FRSH_ERR_INTERNAL_ERROR;
}
int frsh_resource_get_power_level
frsh_resource_id_t resource_id,
frsh_power_level_t *power_level)
{
- int ret;
-
switch(resource_type)
{
+#ifdef CONFIG_ACPI_CPU
case FRSH_RT_PROCESSOR:
{
+ int ret;
ret = fra_CPU_get_level(resource_id,
(int*) power_level);
- if (ret) goto err;
+ if (ret) return FRSH_ERR_INTERNAL_ERROR;
break;
}
+#endif
+#ifdef CONFIG_ACPI_LCD
case FRSH_RT_LCD:
{
+ int ret;
ret = fra_LCD_get_level(resource_id,
(int*) power_level);
- if (ret) goto err;
+ if (ret) return FRSH_ERR_INTERNAL_ERROR;
break;
}
+#endif
default:
return FRSH_ERR_NOT_IMPLEMENTED;
}
return FRSH_NO_ERROR;
-err:
- return FRSH_ERR_INTERNAL_ERROR;
}
int frsh_resource_get_num_power_levels
int frsh_battery_get_expiration(frsh_abs_time_t *expiration)
{
+#ifdef CONFIG_ACPI_CPU
frsh_rel_time_t interval;
int ret;
*expiration = fosa_abs_time_incr(*expiration, interval);
return FRSH_NO_ERROR;
+#else
+ return FRSH_ERR_NOT_IMPLEMENTED;
+#endif
}