#include "core/data.h"
#include "core/devices.h"
#include "core/device-handler.h"
+#include "core/common.h"
#include "device-node.h"
#include "display/setting.h"
vconf_notify_key_changed(VCONFKEY_PM_STATE, (void *)wakeup_cb, NULL);
}
-const struct device_ops lowbat_device_ops = {
- .init = lowbat_init,
+static const struct device_ops lowbat_device_ops = {
+ .priority = DEVICE_PRIORITY_NORMAL,
+ .name = "lowbat",
+ .init = lowbat_init,
};
+
+DEVICE_OPS_REGISTER(&lowbat_device_ops)
}
}
-const struct device_ops bs_device_ops = {
- .init = bs_init,
+static const struct device_ops bs_device_ops = {
+ .priority = DEVICE_PRIORITY_NORMAL,
+ .name = "bs",
+ .init = bs_init,
};
+
+DEVICE_OPS_REGISTER(&bs_device_ops)
#include "core/log.h"
#include "core/common.h"
#include "core/devices.h"
+#include "mmc/mmc-handler.h"
static const struct control_device {
const int id;
action_entry_add_internal(CONTROL_HANDLER_NAME, control_handler, NULL, NULL);
}
-const struct device_ops control_device_ops = {
- .init = control_init,
+static const struct device_ops control_device_ops = {
+ .priority = DEVICE_PRIORITY_NORMAL,
+ .name = "control",
+ .init = control_init,
};
+DEVICE_OPS_REGISTER(&control_device_ops)
#include "predefine.h"
#include "core.h"
#include "devices.h"
+#include "common.h"
enum ss_core_cmd_type {
SS_CORE_ACT_RUN,
_E("fail pipe control fd init");
}
-const struct device_ops core_device_ops = {
- .init = core_init,
+static const struct device_ops core_device_ops = {
+ .priority = DEVICE_PRIORITY_NORMAL,
+ .name = "core",
+ .init = core_init,
};
+
+DEVICE_OPS_REGISTER(&core_device_ops)
}
-const struct device_ops change_device_ops = {
- .init = device_change_init,
- .exit = device_change_exit,
+static const struct device_ops change_device_ops = {
+ .priority = DEVICE_PRIORITY_NORMAL,
+ .name = "device change",
+ .init = device_change_init,
+ .exit = device_change_exit,
};
+
+DEVICE_OPS_REGISTER(&change_device_ops)
#include "devices.h"
#include "device-notifier.h"
#include "list.h"
+#include "common.h"
struct device_notifier {
enum device_notifier_type status;
_I("all deleted!");
}
-const struct device_ops notifier_device_ops = {
+static const struct device_ops notifier_device_ops = {
+ .priority = DEVICE_PRIORITY_NORMAL,
+ .name = "notifier",
.exit = device_notifier_exit,
};
+DEVICE_OPS_REGISTER(¬ifier_device_ops)
#include <stdio.h>
#include "log.h"
-#include "devices.h"
+#include "list.h"
#include "common.h"
+#include "devices.h"
+
+static dd_list *dev_head;
+
+void add_device(const struct device_ops *dev)
+{
+ if (dev->priority == DEVICE_PRIORITY_HIGH)
+ DD_LIST_PREPEND(dev_head, dev);
+ else
+ DD_LIST_APPEND(dev_head, dev);
+}
-static const struct device_ops *devices[] = {
- /* The below devices have init dependency with other module */
- &edbus_device_ops,
- &display_device_ops,
- /* The below devices don't have any init dependency */
- &sysnoti_device_ops,
- ¬i_device_ops,
- &control_device_ops,
- &core_device_ops,
- &signal_device_ops,
- &predefine_device_ops,
- &lowmem_device_ops,
- &lowbat_device_ops,
- &change_device_ops,
- &power_device_ops,
- &bs_device_ops,
- &process_device_ops,
- &time_device_ops,
- &cpu_device_ops,
- &usb_device_ops,
- &ta_device_ops,
- &pmon_device_ops,
- &mmc_device_ops,
- &haptic_device_ops,
- &led_device_ops,
- &vibrator_device_ops,
- ¬ifier_device_ops,
-};
+void remove_device(const struct device_ops *dev)
+{
+ DD_LIST_REMOVE(dev_head, dev);
+}
void devices_init(void *data)
{
- int i;
- int size;
+ dd_list *elem;
const struct device_ops *dev;
- size = ARRAY_SIZE(devices);
- for(i = 0; i < size; ++i) {
- dev = devices[i];
+ DD_LIST_FOREACH(dev_head, elem, dev) {
+ _D("[%s] initialize", dev->name);
if (dev->init)
dev->init(data);
}
void devices_exit(void *data)
{
- int i;
- int size;
+ dd_list *elem;
const struct device_ops *dev;
- size = ARRAY_SIZE(devices);
- for(i = 0; i < size; ++i) {
- dev = devices[i];
+ DD_LIST_FOREACH(dev_head, elem, dev) {
+ _D("[%s] deinitialize", dev->name);
if (dev->exit)
dev->exit(data);
}
#define __DEVICES_H__
#include <errno.h>
+#include "common.h"
+
+enum device_priority {
+ DEVICE_PRIORITY_NORMAL = 0,
+ DEVICE_PRIORITY_HIGH,
+};
struct device_ops {
+ enum device_priority priority;
+ char *name;
void (*init) (void *data);
void (*exit) (void *data);
int (*start) (void);
return -EINVAL;
}
-extern const struct device_ops edbus_device_ops;
-extern const struct device_ops display_device_ops;
-extern const struct device_ops sysnoti_device_ops;
-extern const struct device_ops noti_device_ops;
-extern const struct device_ops control_device_ops;
-extern const struct device_ops core_device_ops;
-extern const struct device_ops signal_device_ops;
-extern const struct device_ops predefine_device_ops;
-extern const struct device_ops lowmem_device_ops;
-extern const struct device_ops lowbat_device_ops;
-extern const struct device_ops change_device_ops;
-extern const struct device_ops power_device_ops;
-extern const struct device_ops bs_device_ops;
-extern const struct device_ops process_device_ops;
-extern const struct device_ops time_device_ops;
-extern const struct device_ops cpu_device_ops;
-extern const struct device_ops usb_device_ops;
-extern const struct device_ops ta_device_ops;
-extern const struct device_ops pmon_device_ops;
-extern const struct device_ops mmc_device_ops;
-extern const struct device_ops haptic_device_ops;
-extern const struct device_ops led_device_ops;
-extern const struct device_ops vibrator_device_ops;
-extern const struct device_ops notifier_device_ops;
+#define DEVICE_OPS_REGISTER(dev) \
+static void __CONSTRUCTOR__ module_init(void) \
+{ \
+ add_device(dev); \
+} \
+static void __DESTRUCTOR__ module_exit(void) \
+{ \
+ remove_device(dev); \
+}
+
+void add_device(const struct device_ops *dev);
+void remove_device(const struct device_ops *dev);
#endif
#include "core/data.h"
#include "core/edbus-handler.h"
#include "core/common.h"
-#include "core/devices.h"
#include "core/device-notifier.h"
#include "core/list.h"
}
}
-static void edbus_init(void *data)
+void edbus_init(void *data)
{
int retry = EDBUS_INIT_RETRY_COUNT;
int i, r;
return;
}
-static void edbus_exit(void *data)
+void edbus_exit(void *data)
{
unregister_edbus_signal_handle();
unregister_edbus_watch_all();
e_dbus_connection_close(edbus_conn);
e_dbus_shutdown();
}
-
-const struct device_ops edbus_device_ops = {
- .init = edbus_init,
- .exit = edbus_exit,
-};
int broadcast_edbus_signal(const char *path, const char *interface,
const char *name, int type, void *value);
+void edbus_init(void *data);
+void edbus_exit(void *data);
+
#endif /* __SS_EDBUS_HANDLE_H__ */
#include "log.h"
#include "data.h"
+#include "edbus-handler.h"
#include "devices.h"
#define SS_PIDFILE_PATH "/var/run/.system_server.pid"
struct ss_main_data ad;
init_ad(&ad);
+ edbus_init(&ad);
devices_init(&ad);
signal(SIGTERM, sig_quit);
signal(SIGUSR1, sig_usr1);
ecore_main_loop_begin();
devices_exit(&ad);
+ edbus_exit(&ad);
ecore_shutdown();
return 0;
}
#include "log.h"
#include "data.h"
#include "devices.h"
+#include "common.h"
static int noti_fd;
heynoti_close(noti_fd);
}
-const struct device_ops noti_device_ops = {
- .init = noti_init,
- .exit = noti_exit,
+static const struct device_ops noti_device_ops = {
+ .priority = DEVICE_PRIORITY_NORMAL,
+ .name = "noti",
+ .init = noti_init,
+ .exit = noti_exit,
};
+
+DEVICE_OPS_REGISTER(¬i_device_ops)
action_entry_load_from_sodir();
}
-const struct device_ops predefine_device_ops = {
- .init = predefine_init,
+static const struct device_ops predefine_device_ops = {
+ .priority = DEVICE_PRIORITY_NORMAL,
+ .name = "predefine",
+ .init = predefine_init,
};
+
+DEVICE_OPS_REGISTER(&predefine_device_ops)
#include "edbus-handler.h"
#include "display/poll.h"
#include "devices.h"
+#include "common.h"
static struct sigaction sig_child_old_act;
static struct sigaction sig_pipe_old_act;
sigaction(SIGPIPE, &sig_act, &sig_pipe_old_act);
}
-const struct device_ops signal_device_ops = {
- .init = signal_init,
+static const struct device_ops signal_device_ops = {
+ .priority = DEVICE_PRIORITY_NORMAL,
+ .name = "signal",
+ .init = signal_init,
};
+
+DEVICE_OPS_REGISTER(&signal_device_ops)
ad->sysnoti_fd = __sysnoti_start();
}
-const struct device_ops sysnoti_device_ops = {
+static const struct device_ops sysnoti_device_ops = {
+ .priority = DEVICE_PRIORITY_NORMAL,
+ .name = "sysnoti",
.init = sysnoti_init,
};
+
+DEVICE_OPS_REGISTER(&sysnoti_device_ops)
vconf_notify_key_changed(VCONFKEY_SETAPPL_PWRSV_CUSTMODE_CPU, (void *)power_saving_cpu_cb, NULL);
}
-const struct device_ops cpu_device_ops = {
- .init = cpu_init,
+static const struct device_ops cpu_device_ops = {
+ .priority = DEVICE_PRIORITY_NORMAL,
+ .name = "cpu",
+ .init = cpu_init,
};
+
+DEVICE_OPS_REGISTER(&cpu_device_ops)
#include "core/device-notifier.h"
#include "core/udev.h"
#include "core/list.h"
+#include "core/common.h"
#define USB_CON_PIDFILE "/var/run/.system_server.pid"
#define PM_STATE_LOG_FILE "/var/log/pm_state.log"
}
const struct device_ops display_device_ops = {
+ .priority = DEVICE_PRIORITY_HIGH,
+ .name = "display",
.init = display_init,
.exit = display_exit,
.status = display_status,
};
+DEVICE_OPS_REGISTER(&display_device_ops)
+
/**
* @}
*/
void (*pm_exit_extention) (void); /**< extention exit function */
int check_processes(enum state_t prohibit_state);
+extern const struct device_ops display_device_ops;
+
/**
* @}
*/
release_module();
}
-const struct device_ops haptic_device_ops = {
- .init = haptic_init,
- .exit = haptic_exit,
+static const struct device_ops haptic_device_ops = {
+ .priority = DEVICE_PRIORITY_NORMAL,
+ .name = "haptic",
+ .init = haptic_init,
+ .exit = haptic_exit,
};
+
+DEVICE_OPS_REGISTER(&haptic_device_ops)
action_entry_add_internal(PREDEF_LED, predefine_action, NULL, NULL);
}
-const struct device_ops led_device_ops = {
+static const struct device_ops led_device_ops = {
+ .priority = DEVICE_PRIORITY_NORMAL,
+ .name = "led",
.init = led_init,
};
+
+DEVICE_OPS_REGISTER(&led_device_ops)
}
const struct device_ops mmc_device_ops = {
+ .priority = DEVICE_PRIORITY_NORMAL,
+ .name = "mmc",
.init = mmc_init,
.start = mmc_start,
.stop = mmc_stop,
};
+
+DEVICE_OPS_REGISTER(&mmc_device_ops)
int mount_fs(char *path, const char *fs_name, const char *mount_data);
int register_mmc_handler(const char *name, struct mmc_filesystem_ops filesystem_type);
+extern const struct device_ops mmc_device_ops;
+
#endif /* __MMC_HANDLER_H__ */
#include "proc/proc-handler.h"
#include "display/poll.h"
#include "display/setting.h"
+#include "display/core.h"
#define SIGNAL_NAME_POWEROFF_POPUP "poweroffpopup"
(void *)lcd_control_edbus_signal_handler);
}
-const struct device_ops power_device_ops = {
+static const struct device_ops power_device_ops = {
+ .priority = DEVICE_PRIORITY_NORMAL,
+ .name = "power",
.init = power_init,
};
+
+DEVICE_OPS_REGISTER(&power_device_ops)
}
}
-const struct device_ops lowmem_device_ops = {
- .init = lowmem_init,
+static const struct device_ops lowmem_device_ops = {
+ .priority = DEVICE_PRIORITY_NORMAL,
+ .name = "lowmem",
+ .init = lowmem_init,
};
+
+DEVICE_OPS_REGISTER(&lowmem_device_ops)
}
}
-const struct device_ops pmon_device_ops = {
- .init = pmon_init,
+static const struct device_ops pmon_device_ops = {
+ .priority = DEVICE_PRIORITY_NORMAL,
+ .name = "pmon",
+ .init = pmon_init,
};
+
+DEVICE_OPS_REGISTER(&pmon_device_ops)
action_entry_add_internal(PROCESS_GROUP_SET, set_process_group_action, NULL, NULL);
}
-const struct device_ops process_device_ops = {
+static const struct device_ops process_device_ops = {
+ .priority = DEVICE_PRIORITY_NORMAL,
+ .name = "process",
.init = process_init,
};
+
+DEVICE_OPS_REGISTER(&process_device_ops)
#include "core/data.h"
#include "core/devices.h"
#include "display/poll.h"
+#include "core/common.h"
#define RETRY 3
vconf_set_int(VCONFKEY_SYSMAN_BATTERY_CHARGE_NOW, val);
}
-const struct device_ops ta_device_ops = {
- .init = ta_init,
+static const struct device_ops ta_device_ops = {
+ .priority = DEVICE_PRIORITY_NORMAL,
+ .name = "ta",
+ .init = ta_init,
};
+
+DEVICE_OPS_REGISTER(&ta_device_ops)
}
}
-const struct device_ops time_device_ops = {
- .init = time_init,
+static const struct device_ops time_device_ops = {
+ .priority = DEVICE_PRIORITY_NORMAL,
+ .name = "time",
+ .init = time_init,
};
+
+DEVICE_OPS_REGISTER(&time_device_ops)