diff options
Diffstat (limited to 'display.c')
-rw-r--r-- | display.c | 61 |
1 files changed, 44 insertions, 17 deletions
@@ -21,6 +21,7 @@ static DEFINE_MUTEX(nanohub_display_mutex); static DECLARE_COMPLETION(message_callback); static int display_state; +static bool allow_read_mcu_disp_state_once = false; ssize_t nanohub_pin_display_select_get(struct device *dev, struct device_attribute *attr, char *buf) @@ -38,8 +39,11 @@ ssize_t nanohub_pin_display_select_set(struct device *dev, struct nanohub_data *data = dev_get_drvdata(dev); const struct nanohub_platform_data *pdata = data->pdata; if (count >= 1 && buf[0] == '0') { + allow_read_mcu_disp_state_once = false; gpio_set_value(pdata->display_select_gpio, 0); } else if (count >= 1 && buf[0] == '1') { + if (gpio_get_value(pdata->display_select_gpio) == 0) + allow_read_mcu_disp_state_once = true; gpio_set_value(pdata->display_select_gpio, 1); } return count; @@ -47,35 +51,56 @@ ssize_t nanohub_pin_display_select_set(struct device *dev, ssize_t nanohub_get_display_state(struct device *dev, struct device_attribute *attr, char *buf) { - int display_state = nanohub_query_display_state(); + struct nanohub_data *data = dev_get_drvdata(dev); + int display_state = nanohub_query_display_state_internal(data, true); + return scnprintf(buf, PAGE_SIZE, "%d", display_state); +} + +ssize_t nanohub_get_display_state_no_check(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct nanohub_data *data = dev_get_drvdata(dev); + int display_state = nanohub_query_display_state_internal(data, false); return scnprintf(buf, PAGE_SIZE, "%d", display_state); } -#define NANOHUB_DISPLAY_COMMAND_TYPE_GET_STATE 0x06 #define NANOHUB_DISPLAY_GET_STATE_TIMEOUT_MS 100 +enum nanohub_display_command_type { + NANOHUB_DISPLAY_COMMAND_GET_STATE = 0x06, + NANOHUB_DISPLAY_COMMAND_GET_STATE_NO_CHECK = 0x07, +}; + static void on_message_received(const char *buffer, size_t length) { if (length == 3 && buffer[0] == NANOHUB_DISPLAY_COMMAND_VERSION && - buffer[1] == NANOHUB_DISPLAY_COMMAND_TYPE_GET_STATE) { + buffer[1] == NANOHUB_DISPLAY_COMMAND_GET_STATE) { display_state = buffer[2]; } complete(&message_callback); } -int nanohub_query_display_state_internal(struct nanohub_data *data) +int nanohub_query_display_state_internal(struct nanohub_data *data, bool check_ownership) { const char message[] = { NANOHUB_DISPLAY_COMMAND_VERSION, - NANOHUB_DISPLAY_COMMAND_TYPE_GET_STATE }; + check_ownership ? NANOHUB_DISPLAY_COMMAND_GET_STATE : + NANOHUB_DISPLAY_COMMAND_GET_STATE_NO_CHECK }; long ret; - const struct nanohub_platform_data *pdata; - - if (unlikely(data == NULL)) - return -EINVAL; - pdata = data->pdata; - if (gpio_get_value(pdata->display_select_gpio) == 1) - return MCU_DISPLAY_NONE; + if (check_ownership) { + const struct nanohub_platform_data *pdata; + if (unlikely(data == NULL)) + return -EINVAL; + + pdata = data->pdata; + if (gpio_get_value(pdata->display_select_gpio) == 1) + return MCU_DISPLAY_NONE; + } else { + if (allow_read_mcu_disp_state_once) + allow_read_mcu_disp_state_once = false; + else + return MCU_DISPLAY_NONE; + } mutex_lock(&nanohub_display_mutex); @@ -92,11 +117,13 @@ int nanohub_query_display_state_internal(struct nanohub_data *data) mutex_unlock(&nanohub_display_mutex); - if (ret < 0) - return ret; - - if (ret == 0) - return -ETIMEDOUT; + if (ret <= 0) { + pr_err("nanohub : failed to query disp, ret = %d\n", ret); + if (ret == 0) + return -ETIMEDOUT; + else + return ret; + } return display_state; } |