static int snd_jack_dev_register(struct snd_device *device)
{
	struct snd_jack *jack = device->device_data;
	struct snd_card *card = device->card;
	int err, i;

	snprintf(jack->name, sizeof(jack->name), "%s %s",
		 card->shortname, jack->id);
	jack->input_dev->name = jack->name;

	/* Default to the sound card device. */
	if (!jack->input_dev->dev.parent)
		jack->input_dev->dev.parent = snd_card_get_device_link(card);

	/* Add capabilities for any keys that are enabled */
	for (i = 0; i < ARRAY_SIZE(jack->key); i++) {
		int testbit = SND_JACK_BTN_0 >> i;

		if (!(jack->type & testbit))
			continue;

		if (!jack->key[i])
			jack->key[i] = BTN_0 + i;

		input_set_capability(jack->input_dev, EV_KEY, jack->key[i]);
	}

	/* Android custom switch API */
	jack->sdev.name = jack->id;
	err = switch_dev_register(&jack->sdev);
	if (err != 0)
		return err;

	err = input_register_device(jack->input_dev);
	if (err != 0)
		goto err_switch;

	jack->registered = 1;

	return 0;

err_switch:
	switch_dev_unregister(&jack->sdev);
	return err;
}
Exemple #2
0
int init_sim_hot_plug(void)
{
	int rc = 0;
	int sim_irq = gpio_to_irq(GPIO_SIM_PIN);
	sim_state = gpio_get_value(GPIO_SIM_PIN);

	RIL_INFO("GPIO = %d , irq = %d, state = %d\n", GPIO_SIM_PIN, sim_irq, sim_state);

	rc = request_irq(sim_irq, sim_interrupt_handler,
			IRQF_TRIGGER_FALLING|IRQF_TRIGGER_RISING, NAME_SIM, NULL);
	if (rc < 0) {
		RIL_ERR("Could not register for %s interrupt, irq = %d, rc = %d\n", NAME_SIM, sim_irq, rc);
		rc = -EIO;
		goto failed;
	}

	/* init work queue */
	INIT_DELAYED_WORK(&workq, sim_irq_work);

	/* register switch class*/
	sim_sdev.name = NAME_SIM;
	sim_sdev.print_name = print_sim_name;
	sim_sdev.print_state = print_sim_state;
	rc = switch_dev_register(&sim_sdev);
	/*
	 * Because switch_dev_register will initiate sdev.state to 0,
	 * sdev.state will be initiated after switch_dev_register.
	 */
	sim_sdev.state = sim_state;

	if (rc < 0) {
		RIL_ERR("Could not register switch device, rc = %d\n", rc);
		goto failed;
	}

	RIL_INFO("request irq and switch class successfully\n");
	return 0;

failed:
	gpio_free(GPIO_SIM_PIN);
	return rc;
}
Exemple #3
0
int mdp_open(struct v4l2_subdev *sd, void *arg)
{
	struct mdp_instance *inst = kzalloc(sizeof(struct mdp_instance),
					GFP_KERNEL);
	struct mdp_msg_ops *mops = arg;
	int rc = 0;
	struct fb_info *fbi = NULL;

	if (!inst) {
		WFD_MSG_ERR("Out of memory\n");
		rc = -ENOMEM;
		goto mdp_open_fail;
	} else if (!mops) {
		WFD_MSG_ERR("Invalid arguments\n");
		rc = -EINVAL;
		goto mdp_open_fail;
	}

	fbi = msm_fb_get_writeback_fb();
	if (!fbi) {
		WFD_MSG_ERR("Failed to acquire mdp instance\n");
		rc = -ENODEV;
		goto mdp_open_fail;
	}
	inst->sdev.name = "wfd";
	/* Register wfd node to switch driver */
	rc = switch_dev_register(&inst->sdev);
	if (rc) {
		WFD_MSG_ERR("WFD switch registration failed\n");
		goto mdp_open_fail;
	}
	msm_fb_writeback_init(fbi);
	inst->mdp = fbi;
	inst->secure = mops->secure;
	inst->uses_iommu_split_domain = mops->iommu_split_domain;

	mops->cookie = inst;
	return rc;
mdp_open_fail:
	kfree(inst);
	return rc;
}
static int felica_int_probe_func(struct felica_dev *d)
{
	int ret;

	dev_dbg(d->dev, "%s\n", __func__);

	if (!d->felica_data->flint->int_init ||
		!d->felica_data->flint->int_read ||
		!d->felica_data->flint->int_release) {
		dev_err(d->dev, "%s: Error. Invalid operation.\n", __func__);
		ret = -EINVAL;
		goto err_invalid;
	}

	/* Init INT GPIO */
	ret = d->felica_data->flint->int_init(d->felica_data->user);
	if (ret) {
		dev_err(d->dev, "%s: Error. INT GPIO init failed.\n", __func__);
		ret = -ENODEV;
		goto err_request_int_gpio;
	}

	/* Create INT switch device (felica_push) */
	d->swdev.name = "felica_push";
	if (switch_dev_register(&d->swdev)) {
		dev_err(d->dev, "%s: Error. Cannot create switch dev\n",
					__func__);
		ret = -ENOMEM;
		goto err_create_switch_dev;
	}

	/* Set initial state */
	switch_set_state(&d->swdev, 0);

	return 0;

err_create_switch_dev:
	d->felica_data->flint->int_release(d->felica_data->user);
err_request_int_gpio:
err_invalid:
	return ret;
}
int init_proximity(void)
{
	int rc = 0;
	/* register switch class*/
	proxi_sdev.name = "proximity";
	proxi_sdev.print_name = print_proxi_name;
	proxi_sdev.print_state = print_proxi_state;
	rc = switch_dev_register(&proxi_sdev);

	if (rc < 0) {
		RIL_ERR("Could not register switch device, rc = %d\n", rc);
		goto failed;
	}

	RIL_INFO("register switch class successfully\n");
	return 0;

failed:
	return rc;
}
static __init int muic_init_switch(void)
{
	int ret;

	pr_info("register extcon notifier for JIG and docks\n");
	switch_dev = device_create(sec_class, NULL, 0, NULL, "switch");
	if (IS_ERR(switch_dev)) {
		pr_err("(%s): failed to created device (switch_dev)!\n",
				__func__);
		return -ENODEV;
	}

	ret = switch_dev_register(&switch_dock);
	if (ret < 0) {
		pr_err("Failed to register dock switch. %d\n",
				ret);
		return ret;
	}
	return 0;
}
void max77803_muic_init_cb(void)
{
	int ret;

	/* for CarDock, DeskDock */
	ret = switch_dev_register(&switch_dock);

	pr_info("%s: MUIC ret=%d\n", __func__, ret);

	if (ret < 0)
		pr_err("Failed to register dock switch. %d\n", ret);

#if defined(CONFIG_SEC_H_PROJECT)
	/* set gpio to enable redriver for USB3.0 */
	gpio_tlmm_config(GPIO_CFG(GPIO_REDRIVER_EN, 0, GPIO_CFG_OUTPUT,
					GPIO_CFG_NO_PULL, GPIO_CFG_2MA), 1);
	gpio_set_value(GPIO_REDRIVER_EN,0);
#endif

}
static void muic_init_switch_dev_cb(void)
{
#ifdef CONFIG_SWITCH
	int ret;

	/* for DockObserver */
	ret = switch_dev_register(&switch_dock);
	if (ret < 0) {
		pr_err("%s: Failed to register dock switch(%d)\n",
				__func__, ret);
		return;
	}
#endif /* CONFIG_SWITCH */

#if defined(CONFIG_MUIC_NOTIFIER)
	muic_notifier_register(&dock_notifier_block,
			muic_handle_dock_notification, MUIC_NOTIFY_DEV_DOCK);
#endif /* CONFIG_MUIC_NOTIFIER */

	pr_info("%s: done\n", __func__);
}
static int __init acoustic_init(void)
{
	int ret = 0;

	mutex_init(&api_lock);
	ret = misc_register(&acoustic_misc);
	if (ret < 0) {
		pr_err("failed to register misc device!\n");
		return ret;
	}

	sdev_beats.name = "Beats";
	sdev_beats.print_name = beats_print_name;

	ret = switch_dev_register(&sdev_beats);
	if (ret < 0) {
		pr_err("failed to register beats switch device!\n");
		return ret;
	}
	return 0;
}
Exemple #10
0
/**********************************************************
**  Function: Headset driver init function
**  Parameter: none
**  Return value: none
**
************************************************************/
static int __init headset_init(void)
{
	printk(KERN_INFO "%s+ #####\n", __func__);
	int ret;

	printk("HEADSET: Headset detection init\n");

	hs_data = kzalloc(sizeof(struct headset_data), GFP_KERNEL);
	if (!hs_data)
		return -ENOMEM;

	hs_data->debouncing_time = ktime_set(0, 100000000);  /* 100 ms */
	hs_data->sdev.name = "h2w";
	hs_data->sdev.print_name = headset_name_show;
	hs_data->sdev.print_state = headset_state_show;

	ret = switch_dev_register(&hs_data->sdev);
	if (ret < 0)
		goto err_switch_dev_register;

	g_detection_work_queue = create_workqueue("detection");

	hrtimer_init(&hs_data->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
	hs_data->timer.function = detect_event_timer_func;

	printk("HEADSET: Headset detection mode\n");
	btn_config_gpio();/*Config hook detection GPIO*/
	jack_config_gpio();/*Config jack detection GPIO*/

	INIT_WORK(&lineout_work, lineout_work_queue);
	lineout_config_gpio();

	printk(KERN_INFO "%s- #####\n", __func__);
	return 0;

err_switch_dev_register:
	printk(KERN_ERR "Headset: Failed to register driver\n");

	return ret;
}
Exemple #11
0
void mt_usb_otg_init(struct musb *musb)
{
    /*init drrvbus*/
    mt_usb_init_drvvbus();

    /* init idpin interrupt */
    INIT_DELAYED_WORK(&musb->id_pin_work, musb_id_pin_work);
    otg_int_init();

    /* EP table */
    musb->fifo_cfg_host = fifo_cfg_host;
    musb->fifo_cfg_host_size = ARRAY_SIZE(fifo_cfg_host);
    
    otg_state.name = "otg_state";
    otg_state.index = 0;
    otg_state.state = 0;
    
    if(switch_dev_register(&otg_state))
        printk("switch_dev_register fail\n");
    else
        printk("switch_dev register success\n");
}
Exemple #12
0
static int aml_m3_audio_probe(struct platform_device *pdev)
{
		int ret;
		//pdev->dev.platform_data;
		// TODO
printk("***Entered %s:%s\n", __FILE__,__func__);
		aml_m3_snd_device = platform_device_alloc("soc-audio", -1);
		if (!aml_m3_snd_device) {
			printk(KERN_ERR "ASoC: Platform device allocation failed\n");
			ret = -ENOMEM;
		}
	
		platform_set_drvdata(aml_m3_snd_device,&aml_m3_snd_devdata);
		aml_m3_snd_devdata.dev = &aml_m3_snd_device->dev;
	
		ret = platform_device_add(aml_m3_snd_device);
		if (ret) {
			printk(KERN_ERR "ASoC: Platform device allocation failed\n");
			goto error2;
		}
		
		aml_m3_platform_device = platform_device_register_simple("aml_m3_codec",
								-1, NULL, 0);
		aml_m3_platform_device->dev.platform_data = pdev->dev.platform_data;
#if HP_DET
		sdev.name = "h2w";//for report headphone to android
		ret = switch_dev_register(&sdev);
		if (ret < 0){
			printk(KERN_ERR "ASoC: register switch dev failed\n");
			goto error1;
		}
#endif
		return 0;
error1:
		platform_device_unregister(aml_m3_snd_device);
error2:
		platform_device_put(aml_m3_snd_device);
		return ret;
}
Exemple #13
0
static int headphone_plug_register(void)
{
    int irq, err;
    int headphone_current_state;

    irq = _get_headphone_irq();
    err = request_irq(irq, headphone_plug_isr, IRQF_TRIGGER_RISING|IRQF_TRIGGER_FALLING,
                      "audio-headphone-int", &pt_audio_device_io);
    if(err < 0)
        return err;

    INIT_WORK(&headphone_work, headphone_plug_work_func);

    err = switch_dev_register(&headphone_sw_dev);
    if(err < 0)
        return err;

    headphone_current_state = _get_headphone_state();
    switch_set_state(&headphone_sw_dev, headphone_current_state);

    return 0;
}
Exemple #14
0
static int h2w_probe(struct platform_device *pdev)
{
    int ret = 0;
    pr_debug("Registering H2W (headset) driver\n");
    hi = kzalloc(sizeof(struct h2w_info), GFP_KERNEL);
    if (!hi)
        return -ENOMEM;
    hi->ignore_btn = 0;
    hi->sdev.name = "h2w";
    hi->sdev.print_name = h2w_print_name;
    /* register a switch device */
    ret = switch_dev_register(&hi->sdev);
    if (ret < 0)
        goto err_switch_dev_register;
    /* register a input */
    hi->input = input_allocate_device();
    if (!hi->input) {
        ret = -ENOMEM;
        goto err_request_input_dev;
    }

    hi->input->name = "8930_handset";
    hi->input->evbit[0] = BIT_MASK(EV_KEY);
    hi->input->keybit[BIT_WORD(KEY_MEDIA)] = BIT_MASK(KEY_MEDIA);
    ret = input_register_device(hi->input);
    if (ret < 0)
        goto err_register_input_dev;

    return 0;

err_register_input_dev:
    input_free_device(hi->input);
err_request_input_dev:

err_switch_dev_register:
    printk(KERN_ERR "Failed to register H2W (headset) driver\n");
    kfree(hi);
    return ret;
}
static int hdmi_switch_probe(struct platform_device *pdev)
{
	int ret;
	struct hdmi_switch_device *hdmi_switch;
	hdmi_switch = kzalloc(sizeof(struct hdmi_switch_device), GFP_KERNEL);
	if (!hdmi_switch)
		return -ENOMEM;

	INIT_WORK(&hdmi_switch->work, hdmi_switch_work_func);
		

	hdmi_switch->sdev.name = HDMI_SWITCH_NAME;
	hdmi_switch->sdev.print_state = hdmi_switch_print_state;
	ret = switch_dev_register(&hdmi_switch->sdev);
	if (ret < 0) {
		logd("err_register_switch\n");
		goto err_register_switch;
	}

	ret = device_create_file(hdmi_switch->sdev.dev, &dev_attr_interface);
	if (ret < 0) {
		goto err_create_sysfs_file;
	}

	platform_set_drvdata(pdev, hdmi_switch);
	s_hdmi_switch = hdmi_switch;

	logd("hdmi_switch_probe() successed\n");

	return 0;

err_create_sysfs_file:
	switch_dev_unregister(&hdmi_switch->sdev);
err_register_switch:
	kfree(hdmi_switch);
	s_hdmi_switch = NULL;
	loge("hdmi_switch_probe() failed\n");
	return ret;
}
static int hdmi_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
    disp_vdevice_init_data init_data;

    pr_info("[DISP_I2C] hdmi_i2c_probe\n");
    memset(&init_data, 0, sizeof(disp_vdevice_init_data));
    ep952_i2c_client = client;

    init_data.disp = hdmi_screen_id;
    memcpy(init_data.name, modules_name, 32);
    init_data.type = DISP_OUTPUT_TYPE_HDMI;
    init_data.fix_timing = 0;

    init_data.func.enable = ep952_open;
    init_data.func.disable = ep952_close;
    init_data.func.set_mode = ep952_set_mode;
    init_data.func.mode_support = ep952_get_mode_support;
    init_data.func.get_HPD_status = ep952_get_hpd_status;
    init_data.func.get_input_csc = ep952_get_input_csc;
    init_data.func.get_video_timing_info = ep952_get_video_timing_info;
	init_data.func.suspend = ep952_suspend;
	init_data.func.resume = ep952_resume;
	init_data.func.early_suspend = ep952_early_suspend;
	init_data.func.late_resume = ep952_late_resume;
    init_data.func.get_interface_para = ep952_hdmi_get_interface_para;
    disp_vdevice_get_source_ops(&hdmi_source_ops);
    hdmi_parse_config();
	EP_HDMI_Init();

    #if defined(CONFIG_SWITCH) || defined(CONFIG_ANDROID_SWITCH)
    switch_dev_register(&hdmi_switch_dev);
    #endif
	ep952_thread_enable();

    ep952_device = disp_vdevice_register(&init_data);

    return 0;
}
//[---]Debug for active wakelock before entering suspend
int __init pm_autosleep_init(void)
{
	//[+++]Debug for active wakelock before entering suspend
    int ret;
    pmsp_dev.name = "PowerManagerServicePrinter";
    pmsp_dev.index = 0;
    INIT_WORK(&pms_printer, pms_printer_func);
    ret = switch_dev_register(&pmsp_dev);
    if (ret < 0)
        printk("%s:fail to register switch power_manager_printer \n",__func__);
    else
        printk("%s:success to register pmsp switch \n",__func__);
	//[---]Debug for active wakelock before entering suspend
	autosleep_ws = wakeup_source_register("autosleep");
	if (!autosleep_ws)
		return -ENOMEM;

	autosleep_wq = alloc_ordered_workqueue("autosleep", 0);
	if (autosleep_wq)
		return 0;

	wakeup_source_unregister(autosleep_ws);
	return -ENOMEM;
}
Exemple #18
0
static int kpd_pdrv_probe(struct platform_device *pdev)
{

	int i, r;
	int err = 0;

#ifdef CONFIG_OF
	kp_base = of_iomap(pdev->dev.of_node, 0);
	if (!kp_base) {
		pr_warn(KPD_SAY "KP iomap failed\n");
		return -ENODEV;
	};

	kp_irqnr = irq_of_parse_and_map(pdev->dev.of_node, 0);
	if (!kp_irqnr) {
		pr_warn(KPD_SAY "KP get irqnr failed\n");
		return -ENODEV;
	}
	pr_warn(KPD_SAY "kp base: 0x%p, addr:0x%p,  kp irq: %d\n", kp_base,&kp_base, kp_irqnr);
#endif

	kpd_ldvt_test_init();	/* API 2 for kpd LFVT test enviroment settings */

	/* initialize and register input device (/dev/input/eventX) */
	kpd_input_dev = input_allocate_device();
	if (!kpd_input_dev)
		return -ENOMEM;

	kpd_input_dev->name = KPD_NAME;
	kpd_input_dev->id.bustype = BUS_HOST;
	kpd_input_dev->id.vendor = 0x2454;
	kpd_input_dev->id.product = 0x6500;
	kpd_input_dev->id.version = 0x0010;
	kpd_input_dev->open = kpd_open;
	
#ifdef AEON_FCOVER_SUPPORT	
	spin_lock_init(&fcover_lock);
	fcover_close_flag = 1;
#endif	
	//fulfill custom settings	
	kpd_memory_setting();

	__set_bit(EV_KEY, kpd_input_dev->evbit);

#if (KPD_PWRKEY_USE_EINT || KPD_PWRKEY_USE_PMIC)
	__set_bit(KPD_PWRKEY_MAP, kpd_input_dev->keybit);
	kpd_keymap[8] = 0;
#endif

#if !KPD_USE_EXTEND_TYPE
	for (i = 17; i < KPD_NUM_KEYS; i += 9)	/* only [8] works for Power key */
		kpd_keymap[i] = 0;
#endif

	for (i = 0; i < KPD_NUM_KEYS; i++) {
		if (kpd_keymap[i] != 0)
			__set_bit(kpd_keymap[i], kpd_input_dev->keybit);
	}

#if KPD_AUTOTEST
	for (i = 0; i < ARRAY_SIZE(kpd_auto_keymap); i++)
		__set_bit(kpd_auto_keymap[i], kpd_input_dev->keybit);
#endif

#if KPD_HAS_SLIDE_QWERTY
	__set_bit(EV_SW, kpd_input_dev->evbit);
	__set_bit(SW_LID, kpd_input_dev->swbit);
#endif

#ifdef KPD_PMIC_RSTKEY_MAP
	__set_bit(KPD_PMIC_RSTKEY_MAP, kpd_input_dev->keybit);
#endif

#ifdef KPD_KEY_MAP
		__set_bit(KPD_KEY_MAP, kpd_input_dev->keybit);
#endif

#ifdef AEON_FCOVER_SUPPORT
//			   __set_bit(KEY_FCOVER_1, kpd_input_dev->keybit);
//			   __set_bit(KEY_FCOVER_2, kpd_input_dev->keybit);
			   __set_bit(KEY_F11, kpd_input_dev->keybit);
			   __set_bit(KEY_F12, kpd_input_dev->keybit);		
#endif

	kpd_input_dev->dev.parent = &pdev->dev;
	r = input_register_device(kpd_input_dev);
	if (r) {
		printk(KPD_SAY "register input device failed (%d)\n", r);
		input_free_device(kpd_input_dev);
		return r;
	}

	/* register device (/dev/mt6575-kpd) */
	kpd_dev.parent = &pdev->dev;
	r = misc_register(&kpd_dev);
	if (r) {
		printk(KPD_SAY "register device failed (%d)\n", r);
		input_unregister_device(kpd_input_dev);
		return r;
	}

#ifdef CONFIG_MTK_TC1_FM_AT_SUSPEND
	wake_lock_init(&kpd_suspend_lock, WAKE_LOCK_SUSPEND, "kpd wakelock");
#endif

	/* register IRQ and EINT */
	kpd_set_debounce(KPD_KEY_DEBOUNCE);
#ifdef CONFIG_OF
	r = request_irq(kp_irqnr, kpd_irq_handler, IRQF_TRIGGER_NONE, KPD_NAME, NULL);
#else
	r = request_irq(MT_KP_IRQ_ID, kpd_irq_handler, IRQF_TRIGGER_FALLING, KPD_NAME, NULL);
#endif
	if (r) {
		printk(KPD_SAY "register IRQ failed (%d)\n", r);
		misc_deregister(&kpd_dev);
		input_unregister_device(kpd_input_dev);
		return r;
	}
	mt_eint_register();

#ifndef KPD_EARLY_PORTING	/*add for avoid early porting build err the macro is defined in custom file */
	long_press_reboot_function_setting();	/* /API 4 for kpd long press reboot function setting */
#endif
	hrtimer_init(&aee_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
	aee_timer.function = aee_timer_func;

#if AEE_ENABLE_5_15
	hrtimer_init(&aee_timer_5s, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
	aee_timer_5s.function = aee_timer_5s_func;
#endif

	if ((err = kpd_create_attr(&kpd_pdrv.driver))) {
		kpd_print("create attr file fail\n");
		kpd_delete_attr(&kpd_pdrv.driver);
		return err;
	}
    pr_warn(KPD_SAY "%s Done\n", __FUNCTION__);
#ifdef AEON_FCOVER_SUPPORT
	fcover_workqueue = create_singlethread_workqueue("fcover");
	INIT_WORK(&fcover_work, fcover_key_handler);
	
	fcover_data.name = "hall";
	fcover_data.index = 0;
	fcover_data.state = fcover_close_flag;
	
	err = switch_dev_register(&fcover_data);
	if(err)
	{
		printk("[Accdet]switch_dev_register returned:%d!\n", err);
//		return 1;
	}

	switch_set_state((struct switch_dev *)&fcover_data, fcover_close_flag);
#ifdef AEON_FCOVER_SUPPORT
	mt_set_gpio_mode(GPIO_FCOVER_EINT_PIN, GPIO_EINT_HALL_PIN_M_GPIO);
	mt_set_gpio_dir(GPIO_FCOVER_EINT_PIN, GPIO_DIR_IN);
	mt_set_gpio_pull_enable(GPIO_FCOVER_EINT_PIN, GPIO_PULL_DISABLE);
//	mt_set_gpio_pull_select(GPIO_FCOVER_EINT_PIN, GPIO_PULL_UP);

	mdelay(20);
	fcover_close_flag = mt_get_gpio_in(GPIO_FCOVER_EINT_PIN);
//	tpd_fcover_setting(fcover_close_flag);

	mt_set_gpio_mode(GPIO_FCOVER_EINT_PIN, GPIO_EINT_HALL_PIN_M_EINT);
	
	mt_eint_set_sens(FCOVER_KEY_EINT, FCOVER_KEY_SENSITIVE);
	mt_eint_set_hw_debounce(FCOVER_KEY_EINT, FCOVER_KEY_DEBOUNCE);
	mt_eint_registration(FCOVER_KEY_EINT, EINTF_TRIGGER_LOW,
	                         kpd_fcover_eint_handler, 0);
	mt_eint_unmask(FCOVER_KEY_EINT);  
	printk(KPD_SAY "xuqian kpd_fcover_eint_handler ..\n");

#else
	mt_set_gpio_mode(GPIO_FCOVER_EINT_PIN, GPIO_EINT_HALL_PIN_M_GPIO);
	mt_set_gpio_dir(GPIO_FCOVER_EINT_PIN, GPIO_DIR_IN);
	mt_set_gpio_pull_enable(GPIO_FCOVER_EINT_PIN, GPIO_PULL_ENABLE);
	mt_set_gpio_pull_select(GPIO_FCOVER_EINT_PIN, GPIO_PULL_DOWN);
	
#endif

//	err = device_create_file(&(pdev->dev), &dev_attr_kpd_fcover_state);
//	if(err)
//	{
//		printk("create attr file dev_attr_kpd_fcover_state error\n");
////		kpd_delete_attr(&kpd_pdrv.driver);
////		return err;
//	}
//	else
//	{
//		printk("create attr file dev_attr_kpd_fcover_state ok\n");
//	}
#endif
	return 0;
}
Exemple #19
0
static int __devinit pm8xxx_cradle_probe(struct platform_device *pdev)
{
	int ret;
#if defined CONFIG_HALLIC_PEN
	unsigned int hall_pen_gpio_irq = 0, hall_pouch_gpio_irq = 0;
#else

#if defined (CONFIG_MACH_MSM8974_T1LTE_GLOBAL_COM) || defined (CONFIG_MACH_MSM8974_T1WIFI_GLOBAL_COM) || defined (CONFIG_MACH_MSM8974_T1WIFIN_GLOBAL_COM) || defined(CONFIG_MACH_MSM8974_T1_ATT)
	unsigned int hall_pouch_gpio_irq = 0;
#else
	unsigned int hall_camera_gpio_irq = 0, hall_pouch_gpio_irq = 0;
#endif

#endif

	struct pm8xxx_cradle_platform_data *pdata;

	if (pdev->dev.of_node) {
		pdata = devm_kzalloc(&pdev->dev,
				sizeof(struct pm8xxx_cradle_platform_data),
				GFP_KERNEL);
		if (pdata == NULL) {
			pr_err("%s: no pdata\n", __func__);
			return -ENOMEM;
		}
		pdev->dev.platform_data = pdata;
#if defined(CONFIG_S5717)
		s5717_parse_dt(&pdev->dev, pdata);
#else
		bu52014hfv_parse_dt(&pdev->dev, pdata);
#endif
	} else {
		pdata = pdev->dev.platform_data;
	}
	if (!pdata) {
		pr_err("%s: no pdata\n", __func__);
		return -ENOMEM;
	}

	cradle = kzalloc(sizeof(*cradle), GFP_KERNEL);
	if (!cradle)
		return -ENOMEM;

	cradle->pdata	= pdata;

	cradle->sdev.name = "smartcover";
	cradle->sdev.print_name = cradle_print_name;
	cradle->pouch = 0;
#if defined CONFIG_HALLIC_PEN
	cradle->pen = 0;
#else

#if !defined (CONFIG_MACH_MSM8974_T1LTE_GLOBAL_COM) && !defined (CONFIG_MACH_MSM8974_T1WIFI_GLOBAL_COM) && !defined (CONFIG_MACH_MSM8974_T1WIFIN_GLOBAL_COM) && !defined(CONFIG_MACH_MSM8974_T1_ATT)
	cradle->camera = 0;
#endif

#endif

	spin_lock_init(&cradle->lock);

	ret = switch_dev_register(&cradle->sdev);
	if (ret < 0)
		goto err_switch_dev_register;

	if (pre_set_flag) {
		cradle_set_deskdock(pre_set_flag);
		cradle->state = pre_set_flag;
	}
	wake_lock_init(&cradle->wake_lock, WAKE_LOCK_SUSPEND, "hall_ic_wakeups");

	INIT_DELAYED_WORK(&cradle->pouch_work, pm8xxx_pouch_work_func);
#if defined CONFIG_HALLIC_PEN
	INIT_DELAYED_WORK(&cradle->pen_work, pm8xxx_pen_work_func);
#else

#if !defined (CONFIG_MACH_MSM8974_T1LTE_GLOBAL_COM) && !defined (CONFIG_MACH_MSM8974_T1WIFI_GLOBAL_COM) && !defined (CONFIG_MACH_MSM8974_T1WIFIN_GLOBAL_COM) && !defined(CONFIG_MACH_MSM8974_T1_ATT)
	INIT_DELAYED_WORK(&cradle->camera_work, pm8xxx_camera_work_func);
#endif

#endif

	printk("%s : init cradle\n", __func__);

	/* initialize irq of gpio_hall */
	if (cradle->pdata->hallic_pouch_detect_pin > 0) {
		hall_pouch_gpio_irq = gpio_to_irq(cradle->pdata->hallic_pouch_detect_pin);
		printk("%s : hall_pouch_gpio_irq = [%d]\n", __func__, hall_pouch_gpio_irq);
		if (hall_pouch_gpio_irq < 0) {
			printk("Failed : GPIO TO IRQ \n");
			ret = hall_pouch_gpio_irq;
			goto err_request_irq;
		}

		ret = request_irq(hall_pouch_gpio_irq, pm8xxx_pouch_irq_handler, pdata->irq_flags, HALL_IC_DEV_NAME, cradle);
		if (ret > 0) {
			printk(KERN_ERR "%s: Can't allocate irq %d, ret %d\n", __func__, hall_pouch_gpio_irq, ret);
			goto err_request_irq;
		}

		if (enable_irq_wake(hall_pouch_gpio_irq) == 0)
			printk("%s :enable_irq_wake Enable(1)\n",__func__);
		else
			printk("%s :enable_irq_wake failed(1)\n",__func__);
	}

#if defined CONFIG_HALLIC_PEN
	if (cradle->pdata->hallic_pen_detect_pin > 0) {
		hall_pen_gpio_irq = gpio_to_irq(cradle->pdata->hallic_pen_detect_pin);
		printk("%s : hall_pen_gpio_irq = [%d]\n", __func__, hall_pen_gpio_irq);
		if (hall_pen_gpio_irq < 0) {
			printk("Failed : GPIO TO IRQ \n");
			ret = hall_pen_gpio_irq;
			goto err_request_irq;
		}
		ret = request_irq(hall_pen_gpio_irq, pm8xxx_pen_irq_handler, pdata->irq_flags, HALL_IC_DEV_NAME, cradle);
		if (ret > 0) {
			printk(KERN_ERR "%s: Can't allocate irq %d, ret %d\n", __func__, hall_pen_gpio_irq, ret);
			goto err_request_irq;
		}

		if (enable_irq_wake(hall_pen_gpio_irq) == 0)
			printk("%s :enable_irq_wake Enable(2)\n",__func__);
		else
			printk("%s :enable_irq_wake failed(2)\n",__func__);
	}
#else

#if !defined (CONFIG_MACH_MSM8974_T1LTE_GLOBAL_COM) && !defined (CONFIG_MACH_MSM8974_T1WIFI_GLOBAL_COM) && !defined (CONFIG_MACH_MSM8974_T1WIFIN_GLOBAL_COM) && !defined(CONFIG_MACH_MSM8974_T1_ATT)
	if (cradle->pdata->hallic_camera_detect_pin > 0) {
		hall_camera_gpio_irq = gpio_to_irq(cradle->pdata->hallic_camera_detect_pin);
		printk("%s : hall_camera_gpio_irq = [%d]\n", __func__, hall_camera_gpio_irq);
		if (hall_camera_gpio_irq < 0) {
			printk("Failed : GPIO TO IRQ \n");
			ret = hall_camera_gpio_irq;
			goto err_request_irq;
		}
		ret = request_irq(hall_camera_gpio_irq, pm8xxx_camera_irq_handler, pdata->irq_flags, HALL_IC_DEV_NAME, cradle);
		if (ret > 0) {
			printk(KERN_ERR "%s: Can't allocate irq %d, ret %d\n", __func__, hall_camera_gpio_irq, ret);
			goto err_request_irq;
		}

		if (enable_irq_wake(hall_camera_gpio_irq) == 0)
			printk("%s :enable_irq_wake Enable(2)\n",__func__);
		else
			printk("%s :enable_irq_wake failed(2)\n",__func__);
	}
#endif

#endif
	printk("%s : pdata->irq_flags = [%d]\n", __func__,(int)pdata->irq_flags);

	printk("%s :boot_cradle_det_func START\n",__func__);
	boot_cradle_det_func();

	ret = device_create_file(&pdev->dev, &cradle_sensing_attr);
	if (ret)
		goto err_request_irq;

	if (cradle->pdata->hallic_pouch_detect_pin > 0) {
		ret = device_create_file(&pdev->dev, &cradle_pouch_attr);
		if (ret)
			goto err_request_irq;
	}

#if defined CONFIG_HALLIC_PEN
	if (cradle->pdata->hallic_pen_detect_pin > 0) {
		ret = device_create_file(&pdev->dev, &cradle_pen_attr);
		if (ret)
			goto err_request_irq;
	}
#else

#if !defined (CONFIG_MACH_MSM8974_T1LTE_GLOBAL_COM) && !defined (CONFIG_MACH_MSM8974_T1WIFI_GLOBAL_COM) && !defined (CONFIG_MACH_MSM8974_T1WIFIN_GLOBAL_COM) && !defined(CONFIG_MACH_MSM8974_T1_ATT)
	if (cradle->pdata->hallic_camera_detect_pin > 0) {
		ret = device_create_file(&pdev->dev, &cradle_camera_attr);
		if (ret)
			goto err_request_irq;
	}
#endif

#endif
	platform_set_drvdata(pdev, cradle);
	return 0;

err_request_irq:
	if (hall_pouch_gpio_irq)
		free_irq(hall_pouch_gpio_irq, 0);
#if defined CONFIG_HALLIC_PEN
	if (hall_pen_gpio_irq)
		free_irq(hall_pen_gpio_irq, 0);
#else
	#if !defined (CONFIG_MACH_MSM8974_T1LTE_GLOBAL_COM) && !defined (CONFIG_MACH_MSM8974_T1WIFI_GLOBAL_COM) && !defined (CONFIG_MACH_MSM8974_T1WIFIN_GLOBAL_COM) && !defined(CONFIG_MACH_MSM8974_T1_ATT)
	if (hall_camera_gpio_irq)
		free_irq(hall_camera_gpio_irq, 0);
	#endif
#endif

err_switch_dev_register:
	switch_dev_unregister(&cradle->sdev);
	kfree(cradle);
	return ret;
}
static int __devinit hall_sensor_probe(struct platform_device *pdev)
{
	int ret = 0;
	struct ak_hall_data * hl;
	struct hall_platform_data *pdata;

	hl = kzalloc(sizeof(*hl), GFP_KERNEL);
	if (hl == NULL) {
		ret = -ENOMEM;
		goto err_alloc_mem_failed;
	}

	HL_LOG("++++++++++++++++++");
	hl->hall_enable = 1;
	if (pdev->dev.of_node) {
		pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
		if (!pdata)
		{
			HL_ERR("platform_data alloc memory fail");
			goto err_alloc_mem_failed;
		}
		ret = hall_sensor_dt_parser(pdev->dev.of_node, pdata);
		if (ret < 0) {
			ret = -ENOMEM;
			goto err_alloc_pdata_mem_failed;
		}
	} else {
		pdata = pdev->dev.platform_data;
	}

	if (pdata) {
		hl->att_used   = pdata->att_used;
		hl->gpio_att   = pdata->gpio_att;
		hl->gpio_att_s = pdata->gpio_att_s;
	}

	ret = hall_input_register(hl);
	if (ret)
		goto err_input_register_device_failed;

	platform_set_drvdata(pdev, hl);
	wake_lock_init(&hl->wake_lock, WAKE_LOCK_SUSPEND, DRIVER_NAME);

	prev_val_n = gpio_get_value(hl->gpio_att);
	ret = request_threaded_irq(gpio_to_irq(hl->gpio_att), NULL, hall_npole_irq_thread,
				   prev_val_n? IRQF_TRIGGER_LOW|IRQF_ONESHOT : IRQF_TRIGGER_HIGH|IRQF_ONESHOT, "ak8789_att", hl);
	if (ret == 0)
	{
		irq_set_irq_wake(gpio_to_irq(hl->gpio_att), 1);
		HL_LOG("Operate in [Interrupt] mode, irq[%d]", gpio_to_irq(hl->gpio_att));
	}
	else
		goto err_request_irq_failed;

	if (hl->att_used > 1) {
		prev_val_s = gpio_get_value(hl->gpio_att_s);
		ret = request_threaded_irq(gpio_to_irq(hl->gpio_att_s), NULL, hall_spole_irq_thread,
				prev_val_s? IRQF_TRIGGER_LOW|IRQF_ONESHOT : IRQF_TRIGGER_HIGH|IRQF_ONESHOT, "ak8789_att_s", hl);
		if (ret == 0)
		{
			irq_set_irq_wake(gpio_to_irq(hl->gpio_att_s), 1);
			HL_LOG("Operate in [Interrupt] mode, irq[%d]", gpio_to_irq(hl->gpio_att_s));
		}
		else
		{
			free_irq(gpio_to_irq(hl->gpio_att), hl);
			goto err_request_irq_failed;
		}
	}

	hall_cover_sysfs_init();

	if (switch_dev_register(&cover_switch) < 0) {
		pr_err("fail to register cover switch!\n");
		return 0;
	}

	switch_set_state(&cover_switch, hl->gpio_att ? 0 : 1);

	g_hl = hl;

	HL_LOG("------------------");
	return 0;

err_request_irq_failed:
	HL_ERR("Request IRQ failed, ret=%d, gpio=%d", ret, hl->gpio_att);
	wake_lock_destroy(&hl->wake_lock);

err_input_register_device_failed:
err_alloc_pdata_mem_failed:
	if (pdev->dev.of_node)
		kfree(pdata);
err_alloc_mem_failed:
	kfree(hl);

	return ret;
}
static int htc_headset_mgr_probe(struct platform_device *pdev)
{
	int ret;

	struct htc_headset_mgr_platform_data *pdata = pdev->dev.platform_data;

	HS_LOG("++++++++++++++++++++");

	hi = kzalloc(sizeof(struct htc_headset_mgr_info), GFP_KERNEL);
	if (!hi)
		return -ENOMEM;

	hi->pdata.driver_flag = pdata->driver_flag;
	hi->pdata.headset_devices_num = pdata->headset_devices_num;
	hi->pdata.headset_devices = pdata->headset_devices;
	hi->pdata.headset_config_num = pdata->headset_config_num;
	hi->pdata.headset_config = pdata->headset_config;

	hi->pdata.hptv_det_hp_gpio = pdata->hptv_det_hp_gpio;
	hi->pdata.hptv_det_tv_gpio = pdata->hptv_det_tv_gpio;
	hi->pdata.hptv_sel_gpio = pdata->hptv_sel_gpio;

	hi->pdata.headset_init = pdata->headset_init;
	hi->pdata.headset_power = pdata->headset_power;

	if (hi->pdata.headset_init)
		hi->pdata.headset_init();

	hi->driver_init_seq = 0;

	hi->early_suspend.suspend = htc_headset_mgr_early_suspend;
	hi->early_suspend.resume = htc_headset_mgr_late_resume;
	register_early_suspend(&hi->early_suspend);

	wake_lock_init(&hi->hs_wake_lock, WAKE_LOCK_SUSPEND, DRIVER_NAME);

	hi->hpin_jiffies = jiffies;
	hi->usb_headset.type = USB_NO_HEADSET;
	hi->usb_headset.status = STATUS_DISCONNECTED;

	hi->hs_35mm_type = HEADSET_UNPLUG;
	hi->h2w_35mm_type = HEADSET_UNPLUG;
	hi->is_ext_insert = 0;
	hi->mic_bias_state = 0;
	hi->mic_detect_counter = 0;
	hi->key_level_flag = -1;
	hi->quick_boot_status = 0;

	atomic_set(&hi->btn_state, 0);

	hi->tty_enable_flag = 0;
	hi->fm_flag = 0;
	hi->debug_flag = 0;

	mutex_init(&hi->mutex_lock);

	hi->sdev_h2w.name = "h2w";
	hi->sdev_h2w.print_name = h2w_print_name;

	ret = switch_dev_register(&hi->sdev_h2w);
	if (ret < 0)
		goto err_h2w_switch_dev_register;

	hi->sdev_usb_audio.name = "usb_audio";
	hi->sdev_usb_audio.print_name = usb_audio_print_name;

	ret = switch_dev_register(&hi->sdev_usb_audio);
	if (ret < 0)
		goto err_usb_audio_switch_dev_register;

	detect_wq = create_workqueue("detect");
	if (detect_wq == NULL) {
		ret = -ENOMEM;
		HS_ERR("Failed to create detect workqueue");
		goto err_create_detect_work_queue;
	}

	button_wq = create_workqueue("button");
	if (button_wq  == NULL) {
		ret = -ENOMEM;
		HS_ERR("Failed to create button workqueue");
		goto err_create_button_work_queue;
	}

	hi->input = input_allocate_device();
	if (!hi->input) {
		ret = -ENOMEM;
		goto err_request_input_dev;
	}

	hi->input->name = "h2w headset";
	set_bit(EV_SYN, hi->input->evbit);
	set_bit(EV_KEY, hi->input->evbit);
	set_bit(KEY_END, hi->input->keybit);
	set_bit(KEY_MUTE, hi->input->keybit);
	set_bit(KEY_VOLUMEDOWN, hi->input->keybit);
	set_bit(KEY_VOLUMEUP, hi->input->keybit);
	set_bit(KEY_NEXTSONG, hi->input->keybit);
	set_bit(KEY_PLAYPAUSE, hi->input->keybit);
	set_bit(KEY_PREVIOUSSONG, hi->input->keybit);
	set_bit(KEY_MEDIA, hi->input->keybit);
	set_bit(KEY_SEND, hi->input->keybit);

	ret = input_register_device(hi->input);
	if (ret < 0)
	goto err_register_input_dev;

	ret = register_attributes();
	if (ret)
		goto err_register_attributes;

#ifdef HTC_HEADSET_CONFIG_MSM_RPC
	if (hi->pdata.driver_flag & DRIVER_HS_MGR_RPC_SERVER) {
		/* Create RPC server */
		ret = msm_rpc_create_server(&hs_rpc_server);
		if (ret < 0) {
			HS_ERR("Failed to create RPC server");
			goto err_create_rpc_server;
		}
		HS_LOG("Create RPC server successfully");
	}
#else
	HS_DBG("NOT support RPC (%du, %du)", hs_rpc_server.prog,
	       hs_rpc_server.vers);
#endif

	headset_mgr_init();
	hs_notify_driver_ready(DRIVER_NAME);

	HS_LOG("--------------------");

	return 0;

#ifdef HTC_HEADSET_CONFIG_MSM_RPC
err_create_rpc_server:
#endif

err_register_attributes:
	input_unregister_device(hi->input);

err_register_input_dev:
	input_free_device(hi->input);

err_request_input_dev:
	destroy_workqueue(button_wq);

err_create_button_work_queue:
	destroy_workqueue(detect_wq);

err_create_detect_work_queue:
	switch_dev_unregister(&hi->sdev_usb_audio);

err_usb_audio_switch_dev_register:
	switch_dev_unregister(&hi->sdev_h2w);

err_h2w_switch_dev_register:
	mutex_destroy(&hi->mutex_lock);
	wake_lock_destroy(&hi->hs_wake_lock);
	kfree(hi);

	HS_ERR("Failed to register %s driver", DRIVER_NAME);

	return ret;
}
int rk_headset_probe(struct platform_device *pdev,struct rk_headset_pdata *pdata)
{
	int ret;
	struct headset_priv *headset;
	
	headset = kzalloc(sizeof(struct headset_priv), GFP_KERNEL);
	if (headset == NULL) {
		dev_err(&pdev->dev, "failed to allocate driver data\n");
		return -ENOMEM;
	}

	headset->pdata = pdata;
	headset->headset_status = HEADSET_OUT;
	headset->hook_status = HOOK_UP;
	headset->isHook_irq = disable;
	headset->cur_headset_status = 0;
	headset->sdev.name = "h2w";
	headset->sdev.print_name = h2w_print_name;
	ret = switch_dev_register(&headset->sdev);
	if (ret < 0)
		goto failed_free;
	
	mutex_init(&headset->mutex_lock[HEADSET]);
	mutex_init(&headset->mutex_lock[HOOK]);
	
	INIT_DELAYED_WORK(&headset->h_delayed_work[HEADSET], headsetobserve_work);
	INIT_DELAYED_WORK(&headset->h_delayed_work[HOOK], hook_work);

	headset->isMic = 0;
	setup_timer(&headset->headset_timer, headset_timer_callback, (unsigned long)headset);
//------------------------------------------------------------------	
	// Create and register the input driver. 
	headset->input_dev = input_allocate_device();
	if (!headset->input_dev) {
		dev_err(&pdev->dev, "failed to allocate input device\n");
		ret = -ENOMEM;
		goto failed_free;
	}	
	headset->input_dev->name = pdev->name;
	headset->input_dev->open = rk_hskey_open;
	headset->input_dev->close = rk_hskey_close;
	headset->input_dev->dev.parent = &pdev->dev;
	//input_dev->phys = KEY_PHYS_NAME;
	headset->input_dev->id.vendor = 0x0001;
	headset->input_dev->id.product = 0x0001;
	headset->input_dev->id.version = 0x0100;
	// Register the input device 
	ret = input_register_device(headset->input_dev);
	if (ret) {
		dev_err(&pdev->dev, "failed to register input device\n");
		goto failed_free_dev;
	}
	input_set_capability(headset->input_dev, EV_KEY,HOOK_KEY_CODE);

#ifdef CONFIG_HAS_EARLYSUSPEND
	hs_early_suspend.suspend = NULL;
	hs_early_suspend.resume = headset_early_resume;
	hs_early_suspend.level = ~0x0;
	register_early_suspend(&hs_early_suspend);
#endif
	//------------------------------------------------------------------
	if (pdata->headset_gpio) {
		if(!pdata->headset_gpio){
			dev_err(&pdev->dev,"failed init headset,please full hook_io_init function in board\n");
			goto failed_free_dev;
		}	

		headset->irq[HEADSET] = gpio_to_irq(pdata->headset_gpio);

		if(pdata->headset_insert_type == HEADSET_IN_HIGH)
			headset->irq_type[HEADSET] = IRQF_TRIGGER_RISING;
		else
			headset->irq_type[HEADSET] = IRQF_TRIGGER_FALLING;
		ret = request_irq(headset->irq[HEADSET], headset_interrupt, headset->irq_type[HEADSET], "headset_input", NULL);
		if (ret) 
			goto failed_free_dev;
		enable_irq_wake(headset->irq[HEADSET]);
	}
	else
		goto failed_free_dev;
//------------------------------------------------------------------
	if (pdata->hook_gpio) {
		headset->irq[HOOK] = gpio_to_irq(pdata->hook_gpio);
		headset->irq_type[HOOK] = pdata->hook_down_type == HOOK_DOWN_HIGH ? IRQF_TRIGGER_RISING : IRQF_TRIGGER_FALLING;
			
		ret = request_irq(headset->irq[HOOK], hook_interrupt, headset->irq_type[HOOK] , "headset_hook", NULL);
		if (ret) 
			goto failed_free_dev;
		disable_irq(headset->irq[HOOK]);
	}
//------------------------------------------------------------------	
	headset_info = headset;
	schedule_delayed_work(&headset->h_delayed_work[HEADSET], msecs_to_jiffies(500));		
	return 0;	
	
failed_free_dev:
	platform_set_drvdata(pdev, NULL);
	input_free_device(headset->input_dev);
failed_free:
	dev_err(&pdev->dev, "failed to headset probe\n");
	kfree(headset);
	return ret;
}
static int gpio_switch_probe(struct platform_device *pdev)
{
    struct gpio_switch_platform_data *pdata = pdev->dev.platform_data;
    struct gpio_switch_data *switch_data;
    int ret = 0;
    SEC_HEADSET_DBG("");
    this_dev = &pdev->dev;

    if (gpio_request(EAR_MIC_BIAS_GPIO, "EARMIC") == 1)
    {
        gpio_direction_output(EAR_MIC_BIAS_GPIO, 0);
    }

    if (!pdata)
        return -EBUSY;

    switch_data = kzalloc(sizeof(struct gpio_switch_data), GFP_KERNEL);
    if (!switch_data)
        return -ENOMEM;
#ifdef USE_REGULATOR
    usb3v1 = regulator_get(this_dev, "usb3v1");
    if (IS_ERR(usb3v1))
        return -ENODEV;
    vintana2 = regulator_get(this_dev, "vintana2");
    if (IS_ERR(vintana2))
        return -ENODEV;
#endif
    switch_data->sdev.name = pdata->name;
    switch_data->gpio = pdata->gpio;
    switch_data->name_on = pdata->name_on;
    switch_data->name_off = pdata->name_off;
    switch_data->state_on = pdata->state_on;
    switch_data->state_off = pdata->state_off;
    switch_data->sdev.print_state = switch_gpio_print_state;

    ret = switch_dev_register(&switch_data->sdev);
    if (ret < 0)
        goto err_switch_dev_register;

    ret = gpio_request(switch_data->gpio, pdev->name);
    if (ret < 0)
        goto err_request_gpio;

    ret = gpio_direction_input(switch_data->gpio);
    if (ret < 0)
        goto err_set_gpio_input;

    INIT_WORK(&switch_data->work, gpio_switch_work);

    switch_data->irq = gpio_to_irq(switch_data->gpio);
    if (switch_data->irq < 0) {
        ret = switch_data->irq;
        goto err_detect_irq_num_failed;
    }

    ret = request_irq(switch_data->irq, gpio_irq_handler,
                      IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
                      pdev->name,
                      switch_data); //Iyyappan_HS
    if (ret < 0)
        goto err_request_irq;
    data = switch_data;

    init_timer(&headset_detect_timer);
    headset_detect_timer.function = headset_detect_timer_handler;

    wake_lock_init(&headset_wake_lock, WAKE_LOCK_SUSPEND, "headset");

    enable_irq_wake(switch_data->irq);

    /* Perform initial detection */
    gpio_switch_work(&switch_data->work);

    return 0;

err_request_irq:
err_detect_irq_num_failed:
err_set_gpio_input:
    gpio_free(switch_data->gpio);
err_request_gpio:
    switch_dev_unregister(&switch_data->sdev);
err_switch_dev_register:
    kfree(switch_data);

    return ret;
}
static int __devinit hs_probe(struct platform_device *pdev)
{
	int rc;
	struct input_dev *ipdev;

	hs = kzalloc(sizeof(struct msm_handset), GFP_KERNEL);
	if (!hs)
		return -ENOMEM;

	hs->sdev.name	= "amss2w";//"h2w";//changed by flin to fix the framework detect 
	hs->sdev.print_name = msm_headset_print_name;

	rc = switch_dev_register(&hs->sdev);
	if (rc)
		goto err_switch_dev_register;

	ipdev = input_allocate_device();
	if (!ipdev) {
		rc = -ENOMEM;
		goto err_alloc_input_dev;
	}
	input_set_drvdata(ipdev, hs);

	hs->ipdev = ipdev;

	if (pdev->dev.platform_data)
		ipdev->name = pdev->dev.platform_data;
	else
		ipdev->name	= DRIVER_NAME;

	ipdev->id.vendor	= 0x0001;
	ipdev->id.product	= 1;
	ipdev->id.version	= 1;

	input_set_capability(ipdev, EV_KEY, KEY_MEDIA);
	input_set_capability(ipdev, EV_SW, SW_HEADPHONE_INSERT);
	input_set_capability(ipdev, EV_KEY, KEY_POWER);
	input_set_capability(ipdev, EV_KEY, KEY_END);

	rc = input_register_device(ipdev);
	if (rc) {
		dev_err(&ipdev->dev,
				"hs_probe: input_register_device rc=%d\n", rc);
		goto err_reg_input_dev;
	}

	platform_set_drvdata(pdev, hs);

	rc = hs_rpc_init();
	if (rc)
		goto err_hs_rpc_init;

	return 0;

err_hs_rpc_init:
	input_unregister_device(ipdev);
	ipdev = NULL;
err_reg_input_dev:
	input_free_device(ipdev);
err_alloc_input_dev:
	switch_dev_unregister(&hs->sdev);
err_switch_dev_register:
	kfree(hs);
	return rc;
}
Exemple #25
0
static int aml_asoc_init(struct snd_soc_pcm_runtime *rtd)
{
    struct snd_soc_card *card = rtd->card;
    struct snd_soc_codec *codec = rtd->codec;
    struct snd_soc_dapm_context *dapm = &codec->dapm;
    struct aml_audio_private_data * p_aml_audio;
    int ret = 0;
    int hp_paraments[5];

    printk(KERN_DEBUG "enter %s \n", __func__);
    p_aml_audio = snd_soc_card_get_drvdata(card);

    ret = snd_soc_add_card_controls(codec->card, aml_m8_controls,
                ARRAY_SIZE(aml_m8_controls));
    if (ret)
       return ret;

    /* Add specific widgets */
    snd_soc_dapm_new_controls(dapm, aml_asoc_dapm_widgets,
                  ARRAY_SIZE(aml_asoc_dapm_widgets));
    if (ret)
        return ret;

#if HP_DET

    p_aml_audio->sdev.name = "h2w";//for report headphone to android
    ret = switch_dev_register(&p_aml_audio->sdev);
    if (ret < 0){
        printk(KERN_ERR "ASoC: register hp switch dev failed\n");
        return ret;
    }

    p_aml_audio->mic_sdev.name = "mic_dev";//for micphone detect
    ret = switch_dev_register(&p_aml_audio->mic_sdev);
    if (ret < 0){
        printk(KERN_ERR "ASoC: register mic switch dev failed\n");
        return ret;
    }

    ret = snd_soc_jack_new(codec, "hp switch", SND_JACK_HEADPHONE, &p_aml_audio->jack);
    if (ret < 0) {
        printk(KERN_WARNING "Failed to alloc resource for hp switch\n");
    } else {
        ret = snd_soc_jack_add_pins(&p_aml_audio->jack, ARRAY_SIZE(jack_pins), jack_pins);
        if (ret < 0) {
            printk(KERN_WARNING "Failed to setup hp pins\n");
        }
    }

    p_aml_audio->mic_det = of_property_read_bool(card->dev->of_node,"mic_det");

    printk("entern %s : mic_det=%d \n",__func__,p_aml_audio->mic_det);
    ret = of_property_read_u32_array(card->dev->of_node, "hp_paraments", &hp_paraments[0], 5);
    if(ret){
        printk("falied to get hp detect paraments from dts file\n");
    }else{
        p_aml_audio->hp_val_h  = hp_paraments[0];  // hp adc value higher base, hp unplugged
        p_aml_audio->hp_val_l  = hp_paraments[1];  // hp adc value low base, 3 section hp plugged.
        p_aml_audio->mic_val   = hp_paraments[2];  // hp adc value mic detect value.
        p_aml_audio->hp_detal  = hp_paraments[3];  // hp adc value test toerance
        p_aml_audio->hp_adc_ch = hp_paraments[4];  // get adc value from which adc port for hp detect

        printk("hp detect paraments: h=%d,l=%d,mic=%d,det=%d,ch=%d \n",p_aml_audio->hp_val_h,p_aml_audio->hp_val_l,
            p_aml_audio->mic_val,p_aml_audio->hp_detal,p_aml_audio->hp_adc_ch);
    }
    init_timer(&p_aml_audio->timer);
    p_aml_audio->timer.function = aml_asoc_timer_func;
    p_aml_audio->timer.data = (unsigned long)p_aml_audio;
    p_aml_audio->data= (void*)card;

    INIT_WORK(&p_aml_audio->work, aml_asoc_work_func);
    mutex_init(&p_aml_audio->lock);

    mutex_lock(&p_aml_audio->lock);
    if (!p_aml_audio->timer_en) {
        aml_audio_start_timer(p_aml_audio, msecs_to_jiffies(100));
    }
    mutex_unlock(&p_aml_audio->lock);

#endif

    return 0;
}
Exemple #26
0
static int __devinit pm8xxx_carkit_probe(struct platform_device *pdev)
{
	int ret, i;
	unsigned int hallic_carkit_gpio_irq = 0;

	struct pm8xxx_carkit_platform_data *pdata;

	printk("[Hall IC] carkit probe\n");

	if (pdev->dev.of_node) {
		pdata = devm_kzalloc(&pdev->dev,
				sizeof(struct pm8xxx_carkit_platform_data),
				GFP_KERNEL);
    	if (pdata == NULL) {
	    	pr_err("%s: no pdata\n", __func__);
		   return -ENOMEM;
		}
		pdev->dev.platform_data = pdata;
		bu52033nvx_parse_dt(&pdev->dev, pdata);
	} else {
		pdata = pdev->dev.platform_data;
	}
	if (!pdata) {
		pr_err("%s: no pdata\n", __func__);
		return -ENOMEM;
	}

	cradle = kzalloc(sizeof(*cradle), GFP_KERNEL);
	if (!cradle)
		return -ENOMEM;

	cradle->pdata	= pdata;

	cradle->sdev.name = "dock";
	cradle->sdev.print_name = cradle_print_name;
	cradle->carkit = 0;

	spin_lock_init(&cradle->lock);

	ret = switch_dev_register(&cradle->sdev);
	if (ret < 0)
		goto err_switch_dev_register;

	if (pre_set_flag) {
		carkit_set_deskdock(pre_set_flag);
		cradle->state = pre_set_flag;
	}

	wake_lock_init(&cradle->wake_lock, WAKE_LOCK_SUSPEND, "dock_wakeups");

	INIT_DELAYED_WORK(&cradle->carkit_work, pm8xxx_carkit_work_func);

	printk("%s : init carkit\n", __func__);

	/* initialize irq of gpio_hall */
	hallic_carkit_gpio_irq = gpio_to_irq(cradle->pdata->hallic_carkit_detect_pin);
	printk("%s : hall_carkit_gpio_irq = [%d]\n", __func__, hallic_carkit_gpio_irq);
	if (hallic_carkit_gpio_irq < 0) {
		printk("Failed : GPIO TO IRQ \n");
		ret = hallic_carkit_gpio_irq;
		goto err_request_irq;
	}
	ret = request_irq(hallic_carkit_gpio_irq, pm8xxx_carkit_irq_handler, pdata->irq_flags, CARKIT_DEV_NAME, cradle);
	if (ret > 0) {
		printk(KERN_ERR "%s: Can't allocate irq %d, ret %d\n", __func__, hallic_carkit_gpio_irq, ret);
		goto err_request_irq;
	}

	if (enable_irq_wake(hallic_carkit_gpio_irq) == 0)
		printk("%s :enable_irq_wake Enable(3)\n",__func__);
	else
		printk("%s :enable_irq_wake failed(3)\n",__func__);

	printk("%s : pdata->irq_flags = [%d]\n", __func__,(int)pdata->irq_flags);

	printk("%s :boot_carkit_det_func START\n",__func__);
	boot_carkit_det_func();

	for (i = 0; i < ARRAY_SIZE(carkit_device_attrs); i++) {
		ret = device_create_file(&pdev->dev, &carkit_device_attrs[i]);
		if (ret)
			goto err_request_irq;
	}

	platform_set_drvdata(pdev, cradle);
	return 0;

err_request_irq:
	if (hallic_carkit_gpio_irq)
		free_irq(hallic_carkit_gpio_irq, 0);

err_switch_dev_register:
	switch_dev_unregister(&cradle->sdev);
	kfree(cradle);
	return ret;
}
static __devinit int tegra_aic326x_driver_probe(struct platform_device *pdev)
{
	struct snd_soc_card *card = &snd_soc_tegra_aic326x;
	struct tegra_aic326x *machine;
	struct tegra_aic326x_platform_data *pdata;
	int ret, i;

	pdata = pdev->dev.platform_data;
	if (!pdata) {
		dev_err(&pdev->dev, "No platform data supplied\n");
		return -EINVAL;
	}

	machine = kzalloc(sizeof(struct tegra_aic326x), GFP_KERNEL);
	if (!machine) {
		dev_err(&pdev->dev, "Can't allocate tegra_aic326x struct\n");
		return -ENOMEM;
	}

	machine->pdata = pdata;

	ret = tegra_asoc_utils_init(&machine->util_data, &pdev->dev);
	if (ret)
		goto err_free_machine;

	card->dev = &pdev->dev;
	platform_set_drvdata(pdev, card);
	snd_soc_card_set_drvdata(card, machine);

#ifdef CONFIG_SWITCH
	/* Add h2w switch class support */
	ret = switch_dev_register(&aic326x_wired_switch_dev);
	if (ret < 0) {
		dev_err(&pdev->dev, "not able to register switch device %d\n",
			ret);
		goto err_fini_utils;
	}
#endif

	ret = snd_soc_register_card(card);
	if (ret) {
		dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n",
			ret);
		goto err_fini_utils;
	}

	if (!card->instantiated) {
		dev_err(&pdev->dev, "No TI AIC3262 codec\n");
		goto err_unregister_card;
	}

	return 0;

err_unregister_card:
	snd_soc_unregister_card(card);
err_fini_utils:
	tegra_asoc_utils_fini(&machine->util_data);
err_free_machine:
	kfree(machine);
	return ret;
}
Exemple #28
0
static int sec_jack_probe(struct platform_device *pdev)
{
	struct sec_jack_info *hi;
	struct sec_jack_platform_data *pdata = pdev->dev.platform_data;
	int ret;
	int sec_jack_keycode[] = {KEY_MEDIA, KEY_VOLUMEUP, KEY_VOLUMEDOWN};
	int i;
	struct class *audio;
	struct device *earjack;

	pr_info(MODULE_NAME "%s : Registering jack driver\n", __func__);
	if (!pdata) {
		pr_err("%s : pdata is NULL.\n", __func__);
		return -ENODEV;
	}
	if (!pdata->get_det_jack_state	||
			!pdata->get_send_key_state || !pdata->zones ||
			!pdata->set_micbias_state ||
#if defined(CONFIG_SAMSUNG_JACK_GNDLDET)
			!pdata->get_gnd_jack_state ||
#endif
#ifdef CONFIG_SAMSUNG_JACK_ADC_SCALE3
			!pdata->get_ear_adc_value ||
#endif
			!pdata->get_adc_value ||
			pdata->num_zones > MAX_ZONE_LIMIT) {
		pr_err("%s : need to check pdata\n", __func__);
		return -ENODEV;
	}

	hi = kzalloc(sizeof(struct sec_jack_info), GFP_KERNEL);
	if (hi == NULL) {
		pr_err("%s : Failed to allocate memory.\n", __func__);
		return -ENOMEM;
	}

	hi->is_ready = false;
	hi->pdata = pdata;
	hi->input = input_allocate_device();
	if (hi->input == NULL) {
		ret = -ENOMEM;
		pr_err("%s : Failed to allocate input device.\n", __func__);
		goto err_request_input_dev;
	}

	hi->input->name = "sec_jack";

	for (i = 0 ; i < 3; i++)
		input_set_capability(hi->input, EV_KEY, sec_jack_keycode[i]);
	ret = input_register_device(hi->input);

	if (ret) {
		pr_err("%s : Failed to register driver\n", __func__);
		goto err_register_input_dev;
	}

	ret = switch_dev_register(&switch_jack_detection);
	if (ret < 0) {
		pr_err("%s : Failed to register switch device\n", __func__);
		goto err_switch_dev_register;
	}

	ret = switch_dev_register(&switch_sendend);
	if (ret < 0) {
		pr_err("%s : Failed to register switch device\n", __func__);
		goto err_switch_dev_register;
	}

	wake_lock_init(&hi->det_wake_lock, WAKE_LOCK_SUSPEND, "sec_jack_det");

#ifdef CONFIG_SYSFS_SEC_SND_JACK
	audio = class_create(THIS_MODULE, "audio");
	if (IS_ERR(audio))
		pr_err("Failed to create class(audio)!\n");

	earjack = device_create(audio, NULL, 0, NULL, "earjack");
	if (IS_ERR(earjack))
		pr_err("Failed to create device(earjack)!\n");

	ret = device_create_file(earjack, &dev_attr_key_state);
	if (ret)
		pr_err("Failed to create device file in sysfs entries(%s)!\n",
				dev_attr_key_state.attr.name);

	ret = device_create_file(earjack, &dev_attr_state);
	if (ret)
		pr_err("Failed to create device file in sysfs entries(%s)!\n",
				dev_attr_state.attr.name);
#ifdef CONFIG_SYSFS_SEC_SND_SELECT_JACK
	ret = device_create_file(earjack, &dev_attr_select_jack);
	if (ret)
		pr_err("Failed to create device file in sysfs entries(%s)!\n",
				dev_attr_select_jack.attr.name);

	ret = device_create_file(earjack, &dev_attr_reselect_jack);
	if (ret)
		pr_err("Failed to create device file in sysfs entries(%s)!\n",
				dev_attr_reselect_jack.attr.name);
#endif
#endif

#if defined (CONFIG_MACH_MELIUS_CHN_CTC)
	ret = device_create_file(earjack, &dev_attr_set_hw_rev);
	if (ret)
		pr_err("Failed to create device file in sysfs entries(%s)!\n",
				dev_attr_set_hw_rev.attr.name);
#endif

	INIT_WORK(&hi->det_work, sec_jack_det_work_func);

	ret = request_threaded_irq(pdata->det_int, NULL,
			sec_jack_det_irq_handler,
			IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING |
			IRQF_ONESHOT, "sec_headset_detect", hi);

	if (ret) {
		pr_err("%s : Failed to request_irq.\n", __func__);
		goto err_request_detect_irq;
	}

	/* to handle insert/removal when we're sleeping in a call */
	ret = enable_irq_wake(pdata->det_int);
	if (ret) {
		pr_err("%s : Failed to enable_irq_wake.\n", __func__);
		goto err_enable_irq_wake;
	}

	INIT_WORK(&hi->sendkey_work, sec_jack_send_key_work_func);

	ret = request_threaded_irq(pdata->send_int, NULL,
			sec_jack_send_key_irq_handler,
			IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING |
			IRQF_ONESHOT,
			"sec_headset_send_key", hi);
	if (ret) {
		pr_err("%s : Failed to request_irq.\n", __func__);

		goto err_request_send_key_irq;
	}

	/* start with send/end interrupt disable. we only enable it
	 * when we detect a 4 pole headset
	 */
	disable_irq(pdata->send_int);
	dev_set_drvdata(earjack, hi);

	/* call irq_thread forcely because of missing interrupt when booting.
	 * 2000ms delay is enough to waiting for adc driver registration.
	 */
	INIT_DELAYED_WORK(&hi->powerup_work, sec_jack_powerup_work_func);
	schedule_delayed_work(&hi->powerup_work, msecs_to_jiffies(2000));

	return 0;

err_request_send_key_irq:
	disable_irq_wake(pdata->det_int);
err_enable_irq_wake:
	free_irq(pdata->det_int, hi);
err_request_detect_irq:
	wake_lock_destroy(&hi->det_wake_lock);
	switch_dev_unregister(&switch_jack_detection);
	switch_dev_unregister(&switch_sendend);
err_switch_dev_register:
	input_unregister_device(hi->input);
	goto err_request_input_dev;
err_register_input_dev:
	input_free_device(hi->input);
err_request_input_dev:
	kfree(hi);

	return ret;
}
static int __devinit hs_probe(struct platform_device *pdev)
{
	int rc = 0;
	struct input_dev *ipdev;

	hs = kzalloc(sizeof(struct msm_handset), GFP_KERNEL);
	if (!hs)
		return -ENOMEM;

	hs->sdev.name	= "h2w";
	hs->sdev.print_name = msm_headset_print_name;

	rc = switch_dev_register(&hs->sdev);
	if (rc)
		goto err_switch_dev_register;

	ipdev = input_allocate_device();
	if (!ipdev) {
		rc = -ENOMEM;
		goto err_alloc_input_dev;
	}
	input_set_drvdata(ipdev, hs);

	hs->ipdev = ipdev;

	if (pdev->dev.platform_data)
		hs->hs_pdata = pdev->dev.platform_data;

	if (hs->hs_pdata->hs_name)
		ipdev->name = hs->hs_pdata->hs_name;
	else
		ipdev->name	= DRIVER_NAME;

	ipdev->id.vendor	= 0x0001;
	ipdev->id.product	= 1;
	ipdev->id.version	= 1;

	input_set_capability(ipdev, EV_KEY, KEY_WAKEUP);
	input_set_capability(ipdev, EV_KEY, KEY_MEDIA);
	input_set_capability(ipdev, EV_KEY, KEY_VOLUMEUP);
	input_set_capability(ipdev, EV_KEY, KEY_VOLUMEDOWN);
	input_set_capability(ipdev, EV_SW, SW_HEADPHONE_INSERT);
	input_set_capability(ipdev, EV_KEY, KEY_POWER);
	
	 //disable KEY_END, enable KEY_SLEEP
	//input_set_capability(ipdev, EV_KEY, KEY_END);
	input_set_capability(ipdev, EV_KEY, KEY_SLEEP);
	
	rc = input_register_device(ipdev);
	if (rc) {
		dev_err(&ipdev->dev,
				"hs_probe: input_register_device rc=%d\n", rc);
		goto err_reg_input_dev;
	}

	platform_set_drvdata(pdev, hs);

	rc = hs_rpc_init();
	if (rc) {
		dev_err(&ipdev->dev, "rpc init failure\n");
		goto err_hs_rpc_init;
	}
   
   #if defined(CONFIG_ZTE_PLATFORM)
	wake_lock_init(&hs_wake_lock, WAKE_LOCK_SUSPEND, "hs");
   #endif
   

	return 0;

err_hs_rpc_init:
	input_unregister_device(ipdev);
	ipdev = NULL;
err_reg_input_dev:
	input_free_device(ipdev);
err_alloc_input_dev:
	switch_dev_unregister(&hs->sdev);
err_switch_dev_register:
	kfree(hs);
	return rc;
}
Exemple #30
0
static int __devinit pm8xxx_cradle_probe(struct platform_device *pdev)
#if 1
{
	int ret, i;

	  unsigned int hall_gpio_irq;

	const struct pm8xxx_cradle_platform_data *pdata =
	                    pdev->dev.platform_data;
	if (!pdata)
	    return -EINVAL;

	cradle = kzalloc(sizeof(*cradle), GFP_KERNEL);
	if (!cradle)
	    return -ENOMEM;

	cradle->pdata    = pdata;

	cradle->sdev.name = "dock";
	cradle->sdev.print_name = cradle_print_name;
	cradle->pouch = cradle->carkit = 0;


	spin_lock_init(&cradle->lock);

	ret = switch_dev_register(&cradle->sdev);

	if (ret < 0)
	    goto err_switch_dev_register;

	if (pre_set_flag) {
	    cradle_set_deskdock(pre_set_flag);
	    cradle->state = pre_set_flag;
	}

	INIT_WORK(&cradle->work, pm8xxx_cradle_work_func);

	printk("%s : init cradle\n", __func__);


	/* initialize irq of gpio_hall */
	hall_gpio_irq = gpio_to_irq(cradle->pdata->pouch_detect_pin);
	printk("%s : hall_gpio_irq = [%d]\n", __func__,hall_gpio_irq);

	if (hall_gpio_irq < 0) {
	    printk("Failed : GPIO TO IRQ \n");
	    ret = hall_gpio_irq;
	    goto err_request_irq;
	}


	printk("%s : pdata->irq_flags = [%d]\n", __func__,(int)pdata->irq_flags);

	ret = request_irq(hall_gpio_irq, pm8xxx_pouch_irq_handler, pdata->irq_flags, HALL_IC_DEV_NAME, cradle);
	if (ret > 0) {
		printk(KERN_ERR "%s: Can't allocate irq %d, ret %d\n", __func__, hall_gpio_irq, ret);
		goto err_request_irq;
	}

	printk("%s : enable_irq_wake \n", __func__);


	if (enable_irq_wake(hall_gpio_irq) == 0)
		printk("%s :enable_irq_wake Enable\n",__func__);
	else
		printk("%s :enable_irq_wake failed\n",__func__);

	printk("%s :boot_cradle_det_func START\n",__func__);
	boot_cradle_det_func();

	for (i = 0; i < ARRAY_SIZE(cradle_device_attrs); i++) {
	ret = device_create_file(&pdev->dev, &cradle_device_attrs[i]);
	if (ret){
	    goto err_request_irq;
	}
	}

	platform_set_drvdata(pdev, cradle);
	return 0;



err_request_irq:
    if (hall_gpio_irq)
        free_irq(hall_gpio_irq, 0);

err_switch_dev_register:
    switch_dev_unregister(&cradle->sdev);
    kfree(cradle);
    return ret;
}