static int handle_hs_rpc_call(struct msm_rpc_server *server,
			   struct rpc_request_hdr *req, unsigned len)
{
	struct rpc_keypad_pass_key_code_args {
		uint32_t key_code;
		uint32_t key_parm;
	};

	switch (req->procedure) {
	case RPC_KEYPAD_NULL_PROC:
		return 0;

	case RPC_KEYPAD_PASS_KEY_CODE_PROC: {
		struct rpc_keypad_pass_key_code_args *args;

		args = (struct rpc_keypad_pass_key_code_args *)(req + 1);
		args->key_code = be32_to_cpu(args->key_code);
		args->key_parm = be32_to_cpu(args->key_parm);

		report_hs_key(args->key_code, args->key_parm);

		return 0;
	}

	case RPC_KEYPAD_SET_PWR_KEY_STATE_PROC:
		/* This RPC function must be available for the ARM9
		 * to function properly.  This function is redundant
		 * when RPC_KEYPAD_PASS_KEY_CODE_PROC is handled. So
		 * input_report_key is not needed.
		 */
		return 0;
	default:
		return -ENODEV;
	}
}
static int handle_hs_rpc_call(struct msm_rpc_server *server,
			   struct rpc_request_hdr *req, unsigned len)
{
	struct rpc_keypad_pass_key_code_args {
		uint32_t key_code;
		uint32_t key_parm;
	};

	switch (req->procedure) {
	case RPC_KEYPAD_NULL_PROC:
		return 0;

	case RPC_KEYPAD_PASS_KEY_CODE_PROC: {
		struct rpc_keypad_pass_key_code_args *args;

		args = (struct rpc_keypad_pass_key_code_args *)(req + 1);
		args->key_code = be32_to_cpu(args->key_code);
		args->key_parm = be32_to_cpu(args->key_parm);

		report_hs_key(args->key_code, args->key_parm);

		return 0;
	}

	case RPC_KEYPAD_SET_PWR_KEY_STATE_PROC:
		/*                                                 
                                                      
                                                      
                                    
   */
		return 0;
	default:
		return -ENODEV;
	}
}
static int process_subs_srvc_callback(struct hs_event_cb_recv *recv)
{
	if (!recv)
		return -ENODATA;

	report_hs_key(be32_to_cpu(recv->key.code), be32_to_cpu(recv->key.parm));

	return 0;
}
static int process_subs_srvc_callback(struct hs_event_cb_recv *recv)
{
	if (!recv)
		return -ENODATA;

//n0p - disable dejitter 
//	report_hs_key(be32_to_cpu(recv->key.code), be32_to_cpu(recv->key.parm));
//	return 0;
//--

	getnstimeofday(&btime);

        curtime = btime.tv_sec & 0xFFFFF;

	curtime = (btime.tv_sec * 1000) + (btime.tv_nsec/1000000);

        //printk("DSC: curtime: %d",btime.tv_sec);

	if ((curtime-prevtime)>KEYDELAY) {
                //filteron=0;
		prevtime=curtime;
		report_hs_key(be32_to_cpu(recv->key.code), be32_to_cpu(recv->key.parm));
                //errorcount=0;
		return 0;
	}

	//Stale timer workaround
	if ((curtime-prevtime)<=0) {
	//errorcount++;
	//disarm filter
	//if (errorcount>0) { prevtime=curtime; report_hs_key(be32_to_cpu(recv->key.code), be32_to_cpu(recv->key.parm)); errorcount=0; };
	prevtime=curtime;
        report_hs_key(be32_to_cpu(recv->key.code), be32_to_cpu(recv->key.parm));
        //printk("DSC: DJT: Timer error count: %d", errorcount);
	return 0;
	}

	return 0;

}
示例#5
0
static int fbx_kybd_config_gpio(void)
{
    struct pm8058_gpio button_configuration = {
        .direction      = PM_GPIO_DIR_IN,
        .pull           = PM_GPIO_PULL_DN,
        .vin_sel        = 2,
        .out_strength   = PM_GPIO_STRENGTH_NO,
        .function       = PM_GPIO_FUNC_NORMAL,
        .inv_int_pol    = 0,
    };
    int rc = 0;

    printk(KERN_INFO "%s\n", __func__);

    rc = pm8058_gpio_config(rd->pmic_gpio_vol_up, &button_configuration);
    if (rc < 0) {
        dev_err(rd->fbx_kybd_pdev, "%s: gpio %d configured failed\n", __func__, rd->pmic_gpio_vol_up);
        return rc;
    } else {
        rc = gpio_request(rd->sys_gpio_vol_up, "vol_up_key");
        if (rc < 0) {
            dev_err(rd->fbx_kybd_pdev, "%s: gpio %d requested failed\n", __func__, rd->sys_gpio_vol_up);
            return rc;
        } else {
            rc = gpio_direction_input(rd->sys_gpio_vol_up);
            if (rc < 0) {
                dev_err(rd->fbx_kybd_pdev, "%s: set gpio %d direction failed\n", __func__, rd->sys_gpio_vol_up);
                return rc;
            }
        }
    }
    
    rc = pm8058_gpio_config(rd->pmic_gpio_vol_dn, &button_configuration);
    if (rc < 0) {
        dev_err(rd->fbx_kybd_pdev, "%s: gpio %d configured failed\n", __func__, rd->pmic_gpio_vol_dn);
        return rc;
    } else {
        rc = gpio_request(rd->sys_gpio_vol_dn, "vol_down_key");
        if (rc < 0) {
            dev_err(rd->fbx_kybd_pdev, "%s: gpio %d requested failed\n", __func__, rd->sys_gpio_vol_dn);
            return rc;
        } else {
            rc = gpio_direction_input(rd->sys_gpio_vol_dn);
            if (rc < 0) {
                dev_err(rd->fbx_kybd_pdev, "%s: set gpio %d direction failed\n", __func__, rd->sys_gpio_vol_dn);
                return rc;
            }
        }
    }
 
    if (rd->product_phase == Product_PR1 || rd->product_phase == Product_EVB) {
        rc = pm8058_gpio_config(rd->pmic_gpio_cam_t, &button_configuration);
        if (rc < 0) {
            dev_err(rd->fbx_kybd_pdev, "%s: gpio %d configured failed\n", __func__, rd->pmic_gpio_cam_t);
            return rc;
        } else {
            rc = gpio_request(rd->sys_gpio_cam_t, "camera_key");
            if (rc < 0) {
                dev_err(rd->fbx_kybd_pdev, "%s: gpio %d requested failed\n", __func__, rd->sys_gpio_cam_t);
                return rc;
            } else {
                rc = gpio_direction_input(rd->sys_gpio_cam_t);
                if (rc < 0) {
                    dev_err(rd->fbx_kybd_pdev, "%s: set gpio %d direction failed\n", __func__, rd->sys_gpio_cam_t);
                    return rc;
                }
            }
        }
        
        rc = pm8058_gpio_config(rd->pmic_gpio_cam_f, &button_configuration);
        if (rc < 0) {
            dev_err(rd->fbx_kybd_pdev, "%s: gpio %d configured failed\n", __func__, rd->pmic_gpio_cam_f);
            return rc;
        } else {
            rc = gpio_request(rd->sys_gpio_cam_f, "camera_focus_key");
            if (rc < 0) {
                dev_err(rd->fbx_kybd_pdev, "%s: gpio %d requested failed\n", __func__, rd->sys_gpio_cam_f);
                return rc;
            } else {
                rc = gpio_direction_input(rd->sys_gpio_cam_f); 
                if (rc < 0) {
                    dev_err(rd->fbx_kybd_pdev, "%s: set gpio %d direction failed\n", __func__, rd->sys_gpio_cam_f);
                    return rc;
                }
            }
        }
    }
    
    /* Div1-FW3-BSP-AUDIO */
    rc = gpio_request(rd->hook_sw_pin, "gpio_hook_sw");
    if (rc) {
        printk("gpio_request failed on pin(rc=%d)\n", rc);
        return rc;
    }
    rc = gpio_direction_input(rd->hook_sw_pin);
    if (rc) {
        printk("gpio_direction_input failed on pin rc=%d\n", rc);
        return rc;
    }
    
    return rc;
}

static void fbx_kybd_volup(struct work_struct *work)
{
    struct fbx_kybd_record *kbdrec  = container_of(work, struct fbx_kybd_record, qkybd_volup);
    struct input_dev *idev          = kbdrec->fbx_kybd_idev;
    bool gpio_val                   = (bool)gpio_get_value_cansleep(kbdrec->sys_gpio_vol_up);
    
    dev_dbg(kbdrec->fbx_kybd_pdev, "%s: Key VOLUMEUP (%d) %s\n", __func__, KEY_VOLUMEUP, !gpio_val ? "was RELEASED" : "is PRESSING");

    if (!gpio_val) {
        input_report_key(idev, KEY_VOLUMEUP, KEYRELEASE); 
    } else {
        input_report_key(idev, KEY_VOLUMEUP, KEYPRESS);
    }
 
    input_sync(idev);
}

static void fbx_kybd_voldn(struct work_struct *work)
{
    struct fbx_kybd_record *kbdrec  = container_of(work, struct fbx_kybd_record, qkybd_voldn);
    struct input_dev *idev          = kbdrec->fbx_kybd_idev;
    bool gpio_val                   = (bool)gpio_get_value_cansleep(kbdrec->sys_gpio_vol_dn);
    
    dev_dbg(kbdrec->fbx_kybd_pdev, "%s: Key VOLUMEDOWN (%d) %s\n", __func__, KEY_VOLUMEDOWN, !gpio_val ? "was RELEASED" : "is PRESSING");

    if (!gpio_val) {
        input_report_key(idev, KEY_VOLUMEDOWN, KEYRELEASE); 
    } else {
        input_report_key(idev, KEY_VOLUMEDOWN, KEYPRESS);
    }
 
    input_sync(idev);
}

static void fbx_kybd_camf(struct work_struct *work)
{
    struct fbx_kybd_record *kbdrec  = container_of(work, struct fbx_kybd_record, qkybd_camf);
    struct input_dev *idev          = kbdrec->fbx_kybd_idev;
    bool gpio_val                   = (bool)gpio_get_value_cansleep(kbdrec->sys_gpio_cam_f);
    
    dev_dbg(kbdrec->fbx_kybd_pdev, "%s: Key FOCUS (%d) %s\n", __func__, KEY_FOCUS, !gpio_val ? "was RELEASED" : "is PRESSING");

    if (!gpio_val) {
        input_report_key(idev, KEY_FOCUS, KEYRELEASE); 
    } else {
        input_report_key(idev, KEY_FOCUS, KEYPRESS);
    }
 
    input_sync(idev);
}

static void fbx_kybd_camt(struct work_struct *work)
{
    struct fbx_kybd_record *kbdrec  = container_of(work, struct fbx_kybd_record, qkybd_camt);
    struct input_dev *idev          = kbdrec->fbx_kybd_idev;
    bool gpio_val                   = (bool)gpio_get_value_cansleep(kbdrec->sys_gpio_cam_t);

    dev_dbg(kbdrec->fbx_kybd_pdev, "%s: Key CAMERA (%d) %s\n", __func__, KEY_CAMERA, !gpio_val ? "was RELEASED" : "is PRESSING");

    if (!gpio_val) {
        input_report_key(idev, KEY_CAMERA, KEYRELEASE); 
    } else {
        input_report_key(idev, KEY_CAMERA, KEYPRESS);
    }
 
    input_sync(idev);
}

/* Div1-FW3-BSP-AUDIO */
static void fbx_kybd_hooksw(struct work_struct *work)
{
    //MM-SL-DisableHookInFTM-oo*{
    #ifndef CONFIG_FIH_FTM  
    struct fbx_kybd_record *kbdrec= container_of(work, struct fbx_kybd_record, hook_switchkey);  
    struct input_dev *idev        = kbdrec->fbx_kybd_idev;  
    bool hook_sw_val              = (bool)gpio_get_value_cansleep(kbdrec->hook_sw_pin);
    bool headset_status           = (bool)gpio_get_value_cansleep(26);


    if((rd->hooksw_irq_enable == true) && (headset_status == 1)){
        disable_irq(MSM_GPIO_TO_INT(kbdrec->hook_sw_pin));
        if(idev)
        {
            if (hook_sw_val) {
                report_hs_key(HS_HEADSET_SWITCH_K, HS_REL_K);
                printk("FIH: keyrelease KEY_HEADSETHOOK\n");
            } else {
                report_hs_key(HS_HEADSET_SWITCH_K, HS_NONE_K);
                printk("FIH: keypress KEY_HEADSETHOOK\n");              
            }
            input_sync(idev);       
        }
        enable_irq(MSM_GPIO_TO_INT(kbdrec->hook_sw_pin));
        enable_irq_wake(MSM_GPIO_TO_INT(kbdrec->hook_sw_pin));
    }
    #endif
    //MM-SL-DisableHookInFTM-oo*} 	
}

static void fbx_kybd_free_irq(void)
{
    free_irq(PM8058_GPIO_IRQ(PMIC8058_IRQ_BASE, rd->pmic_gpio_vol_up), rd);
    free_irq(PM8058_GPIO_IRQ(PMIC8058_IRQ_BASE, rd->pmic_gpio_vol_dn), rd);
    if (rd->product_phase == Product_PR1 || rd->product_phase == Product_EVB) {
        free_irq(PM8058_GPIO_IRQ(PMIC8058_IRQ_BASE, rd->pmic_gpio_cam_f), rd);
        free_irq(PM8058_GPIO_IRQ(PMIC8058_IRQ_BASE, rd->pmic_gpio_cam_t), rd);
    }
    /* Div1-FW3-BSP-AUDIO */
    free_irq(MSM_GPIO_TO_INT(rd->hook_sw_pin), rd);
}
void report_chg_err_key(uint32_t key_code, uint32_t key_parm)
{
    report_hs_key(key_code,key_parm);
}