static void lm3630_late_resume(struct early_suspend *handler) { struct lm3630_chip_data *pchip = container_of(handler, struct lm3630_chip_data, early_suspend); lm3630_power_on(pchip, true); lm3630_chip_init(pchip); pchip->suspended = false; }
/* update and get brightness */ static int lm3630_bank_a_update_status(struct backlight_device *bl) { int ret; struct lm3630_chip_data *pchip = bl_get_data(bl); enum lm3630_pwm_ctrl pwm_ctrl = pchip->pdata->pwm_ctrl; /* brightness 0 means disable */ pchip->brightness_store = (bl->props.brightness >> 3); if (!bl->props.brightness) { ret = regmap_update_bits(pchip->regmap, REG_CTRL, 0x04, 0x00); if (ret < 0) goto out; pchip->enabled = false; lm3630_power_on(pchip, false); return bl->props.brightness; } if (pchip->enabled == false) { lm3630_power_on(pchip, true); lm3630_chip_init(pchip); pchip->enabled = true; } /* pwm control */ if (pwm_ctrl == PWM_CTRL_BANK_A || pwm_ctrl == PWM_CTRL_BANK_ALL) { if (!set_intensity(bl, pchip)) dev_err(pchip->dev, "No pwm control func. in plat-data\n"); } else { /* i2c control */ ret = regmap_update_bits(pchip->regmap, REG_CTRL, 0x80, 0x00); if (ret < 0) goto out; mdelay(1); ret = regmap_write(pchip->regmap, REG_BRT_A, bl->props.brightness >> 3); if (ret < 0) goto out; } return bl->props.brightness; out: dev_err(pchip->dev, "%s: i2c failed to access REG_CTRL\n", __func__); return bl->props.brightness; }
static int lm3630_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct lm3630_platform_data *pdata = NULL; struct lm3630_chip_data *pchip; int ret; ret = gpio_request(27, "backlight_enable"); if(ret) dev_err(&client->dev, "Failed to request gpio 27\n"); else dev_info(&client->dev, "Success to request gpio 27\n"); gpio_direction_output(27, 1); gpio_set_value(27,1); ret = gpio_request(31, "pmu_enable"); if(ret) dev_err(&client->dev, "Failed to request gpio 31\n"); else dev_info(&client->dev, "Success to request gpio 31\n"); gpio_direction_output(31, 1); gpio_set_value(31,1); if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { dev_err(&client->dev, "fail : i2c functionality check...\n"); return -EOPNOTSUPP; } if (client->dev.of_node) { pdata = devm_kzalloc(&client->dev, sizeof(struct lm3630_platform_data), GFP_KERNEL); if (!pdata) { dev_err(&client->dev, "failed to allocate memory\n"); return -ENOMEM; } // lm3630_parse_config(&client->dev); pdata->max_brt_led1 = 255; pdata->max_brt_led2 = 255; pdata->init_brt_led1 = 150; pdata->init_brt_led2 = 150; pdata->pwm_ctrl = PWM_CTRL_DISABLE; pdata->pwm_active = PWM_ACTIVE_HIGH; pdata->bank_a_ctrl = BANK_A_CTRL_LED1; pdata->bank_b_ctrl = BANK_B_CTRL_LED2; pdata->pwm_set_intensity = pwm_set_intensity; } else { pdata = client->dev.platform_data; pdata->max_brt_led1 = 255; pdata->max_brt_led2 = 255; pdata->init_brt_led1 = 150; pdata->init_brt_led2 = 150; } if (pdata == NULL) { dev_err(&client->dev, "fail : no platform data.\n"); return -ENODATA; } pchip = devm_kzalloc(&client->dev, sizeof(struct lm3630_chip_data), GFP_KERNEL); if (!pchip) return -ENOMEM; pchip->pdata = pdata; pchip->dev = &client->dev; pchip->regmap = devm_regmap_init_i2c(client, &lm3630_regmap); if (IS_ERR(pchip->regmap)) { ret = PTR_ERR(pchip->regmap); dev_err(&client->dev, "fail : allocate register map: %d\n", ret); return ret; } i2c_set_clientdata(client, pchip); /* chip initialize */ ret = lm3630_chip_init(pchip); if (ret < 0) { dev_err(&client->dev, "fail : init chip\n"); goto err_chip_init; } switch (pdata->bank_a_ctrl) { case BANK_A_CTRL_ALL: ret = lm3630_backlight_register(pchip, BLED_ALL); pdata->bank_b_ctrl = BANK_B_CTRL_DISABLE; break; case BANK_A_CTRL_LED1: ret = lm3630_backlight_register(pchip, BLED_1); break; case BANK_A_CTRL_LED2: ret = lm3630_backlight_register(pchip, BLED_2); pdata->bank_b_ctrl = BANK_B_CTRL_DISABLE; break; default: break; } if (ret < 0) goto err_bl_reg; if (pdata->bank_b_ctrl && pchip->bled2 == NULL) { ret = lm3630_backlight_register(pchip, BLED_2); if (ret < 0) goto err_bl_reg; } /* interrupt enable : irq 0 is not allowed for lm3630 */ pchip->irq = client->irq; if (pchip->irq) lm3630_intr_config(pchip); dev_info(&client->dev, "LM3630 backlight register OK.\n"); return 0; err_bl_reg: dev_err(&client->dev, "fail : backlight register.\n"); lm3630_backlight_unregister(pchip); err_chip_init: return ret; }
static int lm3630_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct lm3630_platform_data *pdata = client->dev.platform_data; struct lm3630_chip_data *pchip; int ret; /* OPPO 2013-10-24 yxq Add begin for backlight info */ unsigned int revision; static char *temp; /* OPPO 2013-10-24 yxq Add end */ printk("%s:yanghai.\n", __func__); if (client->dev.of_node) { pdata = devm_kzalloc(&client->dev, sizeof(struct lm3630_platform_data), GFP_KERNEL); if (!pdata) { dev_err(&client->dev, "Failed to allocate memory\n"); return -ENOMEM; } ret = lm3630_dt(&client->dev, pdata); if (ret) return ret; } else pdata = client->dev.platform_data; if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { dev_err(&client->dev, "fail : i2c functionality check...\n"); return -EOPNOTSUPP; } if (pdata == NULL) { dev_err(&client->dev, "fail : no platform data.\n"); return -ENODATA; } pchip = devm_kzalloc(&client->dev, sizeof(struct lm3630_chip_data), GFP_KERNEL); if (!pchip) return -ENOMEM; lm3630_pchip=pchip; pchip->pdata = pdata; pchip->dev = &client->dev; //HW enable ret = gpio_request(LM3630_ENABLE_GPIO, "lm3528_enable"); if (ret) { pr_err("lm3528_enable gpio_request failed: %d\n", ret); goto err_gpio_req; } ret = gpio_direction_output(LM3630_ENABLE_GPIO, 1); if (ret) { pr_err("%s: unable to enable!!!!!!!!!!!!\n", __func__); goto err_gpio_req; } //HW enable pchip->regmap = devm_regmap_init_i2c(client, &lm3630_regmap); if (IS_ERR(pchip->regmap)) { ret = PTR_ERR(pchip->regmap); dev_err(&client->dev, "fail : allocate register map: %d\n", ret); return ret; } i2c_set_clientdata(client, pchip); /* chip initialize */ ret = lm3630_chip_init(pchip); /* OPPO 2013-10-24 yxq Add begin for reason */ regmap_read(pchip->regmap,REG_REVISION,&revision); if (revision == 0x02) { temp = "02"; } else { temp = "unknown"; } register_device_proc("backlight", temp, "LM3630A"); /* OPPO 2013-10-24 yxq Add end */ if (ret < 0) { dev_err(&client->dev, "fail : init chip\n"); goto err_chip_init; } #ifdef CONFIG_BL_REGISTER switch (pdata->bank_a_ctrl) { case BANK_A_CTRL_ALL: ret = lm3630_backlight_register(pchip, BLED_ALL); pdata->bank_b_ctrl = BANK_B_CTRL_DISABLE; break; case BANK_A_CTRL_LED1: ret = lm3630_backlight_register(pchip, BLED_1); break; case BANK_A_CTRL_LED2: ret = lm3630_backlight_register(pchip, BLED_2); pdata->bank_b_ctrl = BANK_B_CTRL_DISABLE; break; default: break; } if (ret < 0) goto err_bl_reg; if (pdata->bank_b_ctrl && pchip->bled2 == NULL) { ret = lm3630_backlight_register(pchip, BLED_2); if (ret < 0) goto err_bl_reg; } #endif /* interrupt enable : irq 0 is not allowed for lm3630 */ pchip->irq = client->irq; printk("%s:yanghai client irq =%d\n", __func__,client->irq); pchip->irq=0; if (pchip->irq) lm3630_intr_config(pchip); printk("%s:yanghai----\n", __func__); dev_err(&client->dev, "LM3630 backlight register OK.\n"); #ifdef CONFIG_VENDOR_EDIT /* OPPO zhanglong add 2013-08-30 for ftm test LCD backlight */ ret = device_create_file(&client->dev, &dev_attr_ftmbacklight); if (ret < 0) { dev_err(&client->dev, "failed to create node ftmbacklight\n"); } /* OPPO zhanglong add 2013-08-30 for ftm test LCD backlight end */ #endif //CONFIG_VENDOR_EDIT return 0; #ifdef CONFIG_BL_REGISTER err_bl_reg: dev_err(&client->dev, "fail : backlight register.\n"); lm3630_backlight_unregister(pchip); #endif err_chip_init: return ret; err_gpio_req: if (gpio_is_valid(LM3630_ENABLE_GPIO)) gpio_free(LM3630_ENABLE_GPIO); return ret; }
static int lm3630_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct lm3630_platform_data *pdata = client->dev.platform_data; struct lm3630_chip_data *pchip; int ret; if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { dev_err(&client->dev, "fail : i2c functionality check...\n"); return -EOPNOTSUPP; } if (pdata == NULL) { dev_err(&client->dev, "fail : no platform data.\n"); return -ENODATA; } pchip = devm_kzalloc(&client->dev, sizeof(struct lm3630_chip_data), GFP_KERNEL); if (!pchip) return -ENOMEM; pchip->pdata = pdata; pchip->dev = &client->dev; pchip->brightness_store = pdata->init_brt_led1; pchip->regmap = devm_regmap_init_i2c(client, &lm3630_regmap); if (IS_ERR(pchip->regmap)) { ret = PTR_ERR(pchip->regmap); dev_err(&client->dev, "fail : allocate register map: %d\n", ret); return ret; } i2c_set_clientdata(client, pchip); /* power get*/ ret = lm3630_power_on(pchip, true); if (ret) goto err_bl_pwr; /* chip initialize */ ret = lm3630_chip_init(pchip); if (ret < 0) { dev_err(&client->dev, "fail : init chip\n"); lm3630_power_on(pchip, false); goto err_bl_pwr; } switch (pdata->bank_a_ctrl) { case BANK_A_CTRL_ALL: ret = lm3630_backlight_register(pchip, BLED_ALL); pdata->bank_b_ctrl = BANK_B_CTRL_DISABLE; break; case BANK_A_CTRL_LED1: ret = lm3630_backlight_register(pchip, BLED_1); break; case BANK_A_CTRL_LED2: ret = lm3630_backlight_register(pchip, BLED_2); pdata->bank_b_ctrl = BANK_B_CTRL_DISABLE; break; default: break; } if (ret < 0) goto err_bl_reg; if (pdata->bank_b_ctrl && pchip->bled2 == NULL) { ret = lm3630_backlight_register(pchip, BLED_2); if (ret < 0) goto err_bl_reg; } /* interrupt enable : irq 0 is not allowed for lm3630 */ pchip->irq = client->irq; if (pchip->irq) lm3630_intr_config(pchip); #ifdef CONFIG_HAS_EARLYSUSPEND pchip->early_suspend.suspend = lm3630_early_suspend; pchip->early_suspend.resume = lm3630_late_resume; pchip->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN; register_early_suspend(&pchip->early_suspend); #endif dev_info(&client->dev, "LM3630 backlight register OK.\n"); return 0; err_bl_reg: dev_err(&client->dev, "fail : backlight register.\n"); lm3630_backlight_unregister(pchip); err_bl_pwr: if (pchip) kfree(pchip); err_chip_init: return ret; }
static int lm3630_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct lm3630_platform_data *pdata = client->dev.platform_data; struct lm3630_chip_data *pchip; int ret; if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { dev_err(&client->dev, "fail : i2c functionality check...\n"); return -EOPNOTSUPP; } if (pdata == NULL) { dev_err(&client->dev, "fail : no platform data.\n"); return -ENODATA; } pchip = devm_kzalloc(&client->dev, sizeof(struct lm3630_chip_data), GFP_KERNEL); if (!pchip) return -ENOMEM; pchip->pdata = pdata; pchip->dev = &client->dev; pchip->regmap = devm_regmap_init_i2c(client, &lm3630_regmap); if (IS_ERR(pchip->regmap)) { ret = PTR_ERR(pchip->regmap); dev_err(&client->dev, "fail : allocate register map: %d\n", ret); return ret; } i2c_set_clientdata(client, pchip); /* chip initialize */ ret = lm3630_chip_init(pchip); if (ret < 0) { dev_err(&client->dev, "fail : init chip\n"); goto err_chip_init; } switch (pdata->bank_a_ctrl) { case BANK_A_CTRL_ALL: ret = lm3630_backlight_register(pchip, BLED_ALL); pdata->bank_b_ctrl = BANK_B_CTRL_DISABLE; break; case BANK_A_CTRL_LED1: ret = lm3630_backlight_register(pchip, BLED_1); break; case BANK_A_CTRL_LED2: ret = lm3630_backlight_register(pchip, BLED_2); pdata->bank_b_ctrl = BANK_B_CTRL_DISABLE; break; default: break; } if (ret < 0) goto err_bl_reg; if (pdata->bank_b_ctrl && pchip->bled2 == NULL) { ret = lm3630_backlight_register(pchip, BLED_2); if (ret < 0) goto err_bl_reg; } /* interrupt enable : irq 0 is not allowed for lm3630 */ pchip->irq = client->irq; if (pchip->irq) lm3630_intr_config(pchip); dev_info(&client->dev, "LM3630 backlight register OK.\n"); return 0; err_bl_reg: dev_err(&client->dev, "fail : backlight register.\n"); lm3630_backlight_unregister(pchip); err_chip_init: return ret; }