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; }
//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; }
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; }