Beispiel #1
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;
}
Beispiel #2
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;
}