示例#1
0
struct cust_mt65xx_led *mt_get_cust_led_list(void)
{
	struct cust_mt65xx_led *cust_led_list = get_cust_led_dtsi();

	if (cust_led_list == NULL) {
		LEDS_DEBUG("mt_get_cust_led_list can not get the led info from devices tree .\n");
		cust_led_list = get_cust_led_list();
	}
	return cust_led_list;
}
static int lp5560_leds_remove(struct platform_device *pdev)
{
	struct lp5560_leds_priv *priv = dev_get_drvdata(&pdev->dev);
	LEDS_DEBUG("[LED]%s\n", __func__);

	dev_set_drvdata(&pdev->dev, NULL);

	kfree(priv);

	return 0;
}
/****************************************************************************
 * driver functions
 ***************************************************************************/
static int __init lp5560_leds_probe(struct platform_device *pdev)
{
	struct lp5560_leds_priv *priv;
	int ret=0,i=0;
	LEDS_DEBUG("[LED]%s\n", __func__);


	g_lp5560_leds_data[0] = kzalloc(sizeof(struct lp5560_leds_priv), GFP_KERNEL);
	if (!g_lp5560_leds_data[0]) {
		ret = -ENOMEM;
		goto err;
	}
	
	g_lp5560_leds_data[0]->cdev.name = LED_NAME;
	g_lp5560_leds_data[0]->cdev.brightness_set = lp5560_led_set;
	INIT_WORK(&g_lp5560_leds_data[0]->work, lp5560_led_work);
	g_lp5560_leds_data[0]->gpio = CTRL_PIN;
	g_lp5560_leds_data[0]->level = 0;
	
	ret = led_classdev_register(&pdev->dev, &g_lp5560_leds_data[0]->cdev);
	if (ret)
		goto err;
	platform_set_drvdata(pdev, g_lp5560_leds_data[0]);

	hrtimer_init( &g_timeOutTimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL );
	g_timeOutTimer.function=lp5560_Callback;

	//for factory test
	g_lp5560_leds_data[1] = kzalloc(sizeof(struct lp5560_leds_priv), GFP_KERNEL);
	if (!g_lp5560_leds_data[1]) {
		ret = -ENOMEM;
		goto err;
	}
	g_lp5560_leds_data[1]->cdev.name = "test-led";
	g_lp5560_leds_data[1]->cdev.brightness_set = lp5560_led_set_test;
	INIT_WORK(&g_lp5560_leds_data[1]->work, lp5560_led_work_test);
	g_lp5560_leds_data[1]->gpio = CTRL_PIN;//GPIO_LED_EN;
	g_lp5560_leds_data[1]->level = 0;
	
	ret = led_classdev_register(&pdev->dev, &g_lp5560_leds_data[1]->cdev);
	//end for factory test
	return 0;
err:
	
	for (i = 1; i >=0; i--) {
			if (!g_lp5560_leds_data[i])
				continue;
			led_classdev_unregister(&g_lp5560_leds_data[i]->cdev);
			cancel_work_sync(&g_lp5560_leds_data[i]->work);
			kfree(g_lp5560_leds_data[i]);
			g_lp5560_leds_data[i] = NULL;
	}
	return ret;
}
示例#4
0
//this API add for control the power and temperature
//if enabe=1, the value of brightness will smaller  than max_level, whatever lightservice transfers to driver
int setMaxbrightness(int max_level, int enable)
{

	struct cust_mt65xx_led *cust_led_list = get_cust_led_list();
	mutex_lock(&bl_level_limit_mutex);
	if (1 == enable)
	{
		limit_flag = 1;
		limit = max_level;
		mutex_unlock(&bl_level_limit_mutex);
		LEDS_DEBUG("[LED] setMaxbrightness limit happen and release lock!!\n");
		printk("setMaxbrightness enable:last_level=%d\n", last_level);
		printk("setMaxbrightness enable:current_level=%d\n", current_level);
		//if (limit < last_level){
		if (0 != current_level){
		printk("mt65xx_leds_set_cust in setMaxbrightness:value control start! limit=%d\n", limit);
		mt65xx_led_set_cust(&cust_led_list[MT65XX_LED_TYPE_LCD], limit);
		}
	}
	else
	{
		limit_flag = 0;
		limit = 255;
		mutex_unlock(&bl_level_limit_mutex);
		LEDS_DEBUG("[LED] setMaxbrightness limit closed and and release lock!!\n");
		printk("setMaxbrightness disable:last_level=%d\n", last_level);
		printk("setMaxbrightness enable:current_level=%d\n", current_level);
		//if (last_level != 0){
		if (0 != current_level){
		printk("control temperature close:limit=%d\n", limit);
		mt65xx_led_set_cust(&cust_led_list[MT65XX_LED_TYPE_LCD], last_level);
		
		//printk("mt65xx_leds_set_cust in setMaxbrightness:value control close!\n");
		}
	}
 	
	LEDS_DEBUG("[LED] setMaxbrightness limit_flag = %d, limit=%d, current_level=%d\n",limit_flag, limit, current_level);
	
	return 0;
	
}
/***********************************************************************************
* please add platform device in mt_devs.c
*
************************************************************************************/
static int __init lp5560_leds_init(void)
{
	int ret;

	LEDS_DEBUG("[LED]%s\n", __func__);

	ret = platform_driver_register(&lp5560_leds_driver);

	if (ret)
	{
		printk("[LED]lp5560_leds_init:drv:E%d\n", ret);
		return ret;
	}

	return ret;
}
示例#6
0
struct cust_mt65xx_led *get_cust_led_dtsi(void)
{
	struct device_node *led_node = NULL;
	bool isSupportDTS = false;
	int i, ret;
	int mode, data;
	int pwm_config[5] = { 0 };

	if (pled_dtsi == NULL) {
		/* this can allocat an new struct array */
		pled_dtsi =
		    (struct cust_mt65xx_led *)kmalloc(MT65XX_LED_TYPE_TOTAL *
						      sizeof(struct cust_mt65xx_led), GFP_KERNEL);
		if (pled_dtsi == NULL) {
			LEDS_DEBUG("get_cust_led_dtsi kmalloc fail\n");
			goto out;
		}

		for (i = 0; i < MT65XX_LED_TYPE_TOTAL; i++) {

			char node_name[32] = "mediatek,";

			pled_dtsi[i].name = leds_name[i];
			led_node =
			    of_find_compatible_node(NULL, NULL, strcat(node_name, leds_name[i]));
			if (!led_node) {
				LEDS_DEBUG("Cannot find LED node from dts\n");
				pled_dtsi[i].mode = 0;
				pled_dtsi[i].data = -1;
			} else {
				isSupportDTS = true;
				ret = of_property_read_u32(led_node, "led_mode", &mode);
				if (!ret) {
					pled_dtsi[i].mode = mode;
					LEDS_DEBUG("The %s's led mode is : %d\n", pled_dtsi[i].name,
						   pled_dtsi[i].mode);
				} else {
					LEDS_DEBUG("led dts can not get led mode");
					pled_dtsi[i].mode = 0;
				}

				ret = of_property_read_u32(led_node, "data", &data);
				if (!ret) {
					pled_dtsi[i].data = data;
					LEDS_DEBUG("The %s's led data is : %ld\n",
						   pled_dtsi[i].name, pled_dtsi[i].data);
				} else {
					LEDS_DEBUG("led dts can not get led data");
					pled_dtsi[i].data = -1;
				}

				ret =
				    of_property_read_u32_array(led_node, "pwm_config", pwm_config,
							       ARRAY_SIZE(pwm_config));
				if (!ret) {
					LEDS_DEBUG("The %s's pwm config data is %d %d %d %d %d\n",
						   pled_dtsi[i].name, pwm_config[0], pwm_config[1],
						   pwm_config[2], pwm_config[3], pwm_config[4]);
					pled_dtsi[i].config_data.clock_source = pwm_config[0];
					pled_dtsi[i].config_data.div = pwm_config[1];
					pled_dtsi[i].config_data.low_duration = pwm_config[2];
					pled_dtsi[i].config_data.High_duration = pwm_config[3];
					pled_dtsi[i].config_data.pmic_pad = pwm_config[4];

				} else
					LEDS_DEBUG("led dts can not get pwm config data.\n");

				switch (pled_dtsi[i].mode) {
				case MT65XX_LED_MODE_CUST_LCM:
					pled_dtsi[i].data = (long)mtkfb_set_backlight_level;
					LEDS_DEBUG("kernel:the backlight hw mode is LCM.\n");
					break;
				case MT65XX_LED_MODE_CUST_BLS_PWM:
					pled_dtsi[i].data = (long)disp_bls_set_backlight;
					LEDS_DEBUG("kernel:the backlight hw mode is BLS.\n");
					break;
				default:
					break;
				}
			}
		}

		if (!isSupportDTS) {
			kfree(pled_dtsi);
			pled_dtsi = NULL;
		}
	}
out:
	return pled_dtsi;
}