static int max77693_led_probe(struct platform_device *pdev) { int ret = 0; int i; struct max77693_dev *max77693 = dev_get_drvdata(pdev->dev.parent); struct max77693_platform_data *max77693_pdata = dev_get_platdata(max77693->dev); struct max77693_led_platform_data *pdata = max77693_pdata->led_data; struct max77693_led_data *led_data; struct max77693_led *data; struct max77693_led_data **led_datas; if (pdata == NULL) { pr_err("[LED] no platform data for this led is found\n"); return -EFAULT; } led_datas = kzalloc(sizeof(struct max77693_led_data *) * MAX77693_LED_MAX, GFP_KERNEL); if (unlikely(!led_datas)) { pr_err("[LED] memory allocation error %s", __func__); return -ENOMEM; } platform_set_drvdata(pdev, led_datas); pr_debug("[LED] %s\n", __func__); for (i = 0; i != pdata->num_leds; ++i) { data = &(pdata->leds[i]); led_data = kzalloc(sizeof(struct max77693_led_data), GFP_KERNEL); led_datas[i] = led_data; if (unlikely(!led_data)) { pr_err("[LED] memory allocation error %s\n", __func__); ret = -ENOMEM; continue; } led_data->max77693 = max77693; led_data->i2c = max77693->i2c; led_data->data = data; led_data->led.name = data->name; led_data->led.brightness_set = max77693_led_set; led_data->led.brightness = LED_OFF; led_data->brightness = data->brightness; led_data->led.flags = 0; led_data->led.max_brightness = reg_led_timer[data->id] == MAX77693_LED_REG_FLASH_TIMER ? MAX_FLASH_DRV_LEVEL : MAX_TORCH_DRV_LEVEL; mutex_init(&led_data->lock); spin_lock_init(&led_data->value_lock); INIT_WORK(&led_data->work, max77693_led_work); ret = led_classdev_register(&pdev->dev, &led_data->led); if (unlikely(ret)) { pr_err("unable to register LED\n"); kfree(led_data); ret = -EFAULT; continue; } ret = max77693_led_setup(led_data); if (unlikely(ret)) { pr_err("unable to register LED\n"); mutex_destroy(&led_data->lock); led_classdev_unregister(&led_data->led); kfree(led_data); ret = -EFAULT; } } /* print_all_reg_value(max77693->i2c); */ flash_dev = device_create(camera_class, NULL, 0, led_datas[1], "flash"); if (IS_ERR(flash_dev)) pr_err("Failed to create device(flash)!\n"); if (device_create_file(flash_dev, &dev_attr_rear_flash) < 0) { pr_err("failed to create device file, %s\n", dev_attr_rear_flash.attr.name); } return ret; }
static int max77693_led_probe(struct platform_device *pdev) { int ret = 0; int i; struct max77693_dev *max77693 = dev_get_drvdata(pdev->dev.parent); struct max77693_platform_data *max77693_pdata = dev_get_platdata(max77693->dev); struct max77693_led_platform_data *pdata = max77693_pdata->led_data; struct max77693_led_data *led_data; struct max77693_led *data; struct max77693_led_data **led_datas; if (pdata == NULL) { pr_err("[LED] no platform data for this led is found\n"); return -EFAULT; } led_datas = kzalloc(sizeof(struct max77693_led_data *) * MAX77693_LED_MAX, GFP_KERNEL); if (unlikely(!led_datas)) { pr_err("[LED] memory allocation error %s", __func__); return -ENOMEM; } platform_set_drvdata(pdev, led_datas); pr_debug("[LED] %s\n", __func__); for (i = 0; i != pdata->num_leds; ++i) { data = &(pdata->leds[i]); led_data = kzalloc(sizeof(struct max77693_led_data), GFP_KERNEL); led_datas[i] = led_data; if (unlikely(!led_data)) { pr_err("[LED] memory allocation error %s\n", __func__); ret = -ENOMEM; continue; } led_data->max77693 = max77693; led_data->i2c = max77693->i2c; led_data->data = data; led_data->led.name = data->name; led_data->led.brightness_set = max77693_led_set; led_data->led.brightness = LED_OFF; led_data->brightness = data->brightness; led_data->led.flags = LED_CORE_SUSPENDRESUME; led_data->led.max_brightness = data->id < 2 ? MAX_FLASH_DRV_LEVEL : MAX_TORCH_DRV_LEVEL; mutex_init(&led_data->lock); spin_lock_init(&led_data->value_lock); INIT_WORK(&led_data->work, max77693_led_work); ret = led_classdev_register(&pdev->dev, &led_data->led); if (unlikely(ret)) { pr_err("unable to register LED\n"); kfree(led_data); ret = -EFAULT; continue; } ret = max77693_led_setup(led_data); if (unlikely(ret)) { pr_err("unable to register LED\n"); led_classdev_unregister(&led_data->led); kfree(led_data); ret = -EFAULT; } } /* print_all_reg_value(max77693->i2c); */ if (pdata->hw_init) pdata->hw_init(); /* important */ max77693_led_torch_en = pdata->torch_en; max77693_led_create_node(pdata); return ret; }