示例#1
0
static int register_input_device(struct usf_type *usf_info,
                                 struct us_input_info_type *input_info)
{
    int rc = 0;
    bool ret = true;
    uint16_t ind = 0;

    if ((usf_info == NULL) ||
            (input_info == NULL) ||
            !(input_info->event_types & USF_ALL_EVENTS)) {
        pr_err("%s: wrong input parameter(s)\n", __func__);
        return -EINVAL;
    }

    for (ind = 0; ind < USF_MAX_EVENT_IND; ++ind) {
        if (usf_info->input_ifs[ind] != NULL) {
            pr_err("%s: input_if[%d] is already allocated\n",
                   __func__, ind);
            return -EFAULT;
        }
        if ((input_info->event_types &
                s_usf_input_devs[ind].event_type) &&
                s_usf_input_devs[ind].prepare_dev) {
            rc = (*s_usf_input_devs[ind].prepare_dev)(
                     ind,
                     usf_info,
                     input_info,
                     s_usf_input_devs[ind].input_dev_name);
            if (rc)
                return rc;

            rc = input_register_device(usf_info->input_ifs[ind]);
            if (rc) {
                pr_err("%s: input_reg_dev() failed; rc=%d\n",
                       __func__, rc);
                input_free_device(usf_info->input_ifs[ind]);
                usf_info->input_ifs[ind] = NULL;
            } else {
                usf_info->event_types |=
                    s_usf_input_devs[ind].event_type;
                pr_debug("%s: input device[%s] was registered\n",
                         __func__,
                         s_usf_input_devs[ind].input_dev_name);
            }
        } /* supported event */
    } /* event types loop */

    ret = usf_register_conflicting_events(
              input_info->conflicting_event_types);
    if (ret)
        usf_info->conflicting_event_types =
            input_info->conflicting_event_types;

    return 0;
}
示例#2
0
文件: usf.c 项目: lolhi/ef52-kernel
static int register_input_device(struct usf_type *usf_info,
				 struct us_input_info_type *input_info)
{
	int rc = 0;
#ifndef SKY_ULTRASOUNDPEN_FEATURE	
	bool ret = true;
#endif
	uint16_t ind = 0;

	if ((usf_info == NULL) ||
	    (input_info == NULL) ||
	    !(input_info->event_types & USF_ALL_EVENTS)) {
		pr_err("%s: wrong input parameter(s)\n", __func__);
		return -EINVAL;
	}

	if (input_info->event_src < ARRAY_SIZE(s_event_src_map))
		usf_info->event_src =
			s_event_src_map[input_info->event_src];
	else
		usf_info->event_src = 0;

	for (ind = 0; ind < USF_MAX_EVENT_IND; ++ind) {
		if (usf_info->input_ifs[ind] != NULL) {
			pr_err("%s: input_if[%d] is already allocated\n",
				__func__, ind);
			return -EFAULT;
		}
		if ((input_info->event_types &
			s_usf_input_devs[ind].event_type) &&
		     s_usf_input_devs[ind].prepare_dev) {
			rc = (*s_usf_input_devs[ind].prepare_dev)(
				ind,
				usf_info,
				input_info,
				s_usf_input_devs[ind].input_dev_name);
			if (rc)
				return rc;


			if (usf_info->event_src)
				input_set_capability(usf_info->input_ifs[ind],
						     EV_KEY,
						     usf_info->event_src);

			rc = input_register_device(usf_info->input_ifs[ind]);
			if (rc) {
				pr_err("%s: input_reg_dev() failed; rc=%d\n",
					__func__, rc);
				input_free_device(usf_info->input_ifs[ind]);
				usf_info->input_ifs[ind] = NULL;
			} else {
				usf_info->event_types |=
					s_usf_input_devs[ind].event_type;
				pr_debug("%s: input device[%s] was registered\n",
					__func__,
					s_usf_input_devs[ind].input_dev_name);
			}
		} /* supported event */
	} /* event types loop */

#ifndef SKY_ULTRASOUNDPEN_FEATURE
	ret = usf_register_conflicting_events(
			input_info->conflicting_event_types);
	if (ret)
		usf_info->conflicting_event_types =
			input_info->conflicting_event_types;
#endif

	return 0;
}