static int max8997_led_probe(struct platform_device *pdev) { struct max8997_dev *iodev = dev_get_drvdata(pdev->dev.parent); struct max8997_platform_data *pdata = dev_get_platdata(iodev->dev); struct max8997_led *led; char name[20]; int ret = 0; if (pdata == NULL) { dev_err(&pdev->dev, "no platform data\n"); return -ENODEV; } led = devm_kzalloc(&pdev->dev, sizeof(*led), GFP_KERNEL); if (led == NULL) return -ENOMEM; led->id = pdev->id; snprintf(name, sizeof(name), "max8997-led%d", pdev->id); led->cdev.name = name; led->cdev.brightness_set = max8997_led_brightness_set; led->cdev.flags |= LED_CORE_SUSPENDRESUME; led->cdev.brightness = 0; led->cdev.groups = max8997_groups; led->iodev = iodev; /* initialize mode and brightness according to platform_data */ if (pdata->led_pdata) { u8 mode = 0, brightness = 0; mode = pdata->led_pdata->mode[led->id]; brightness = pdata->led_pdata->brightness[led->id]; max8997_led_set_mode(led, pdata->led_pdata->mode[led->id]); if (brightness > led->cdev.max_brightness) brightness = led->cdev.max_brightness; max8997_led_set_current(led, brightness); led->cdev.brightness = brightness; } else { max8997_led_set_mode(led, MAX8997_NONE); max8997_led_set_current(led, 0); } mutex_init(&led->mutex); platform_set_drvdata(pdev, led); ret = led_classdev_register(&pdev->dev, &led->cdev); if (ret < 0) return ret; return 0; }
static ssize_t max8997_led_store_mode(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { struct led_classdev *led_cdev = dev_get_drvdata(dev); struct max8997_led *led = container_of(led_cdev, struct max8997_led, cdev); enum max8997_led_mode mode; mutex_lock(&led->mutex); if (!strncmp(buf, "FLASH_PIN_CONTROL", 17)) mode = MAX8997_FLASH_PIN_CONTROL_MODE; else if (!strncmp(buf, "MOVIE_PIN_CONTROL", 17)) mode = MAX8997_MOVIE_PIN_CONTROL_MODE; else if (!strncmp(buf, "FLASH", 5)) mode = MAX8997_FLASH_MODE; else if (!strncmp(buf, "MOVIE", 5)) mode = MAX8997_MOVIE_MODE; else mode = MAX8997_NONE; max8997_led_set_mode(led, mode); mutex_unlock(&led->mutex); return size; }
static int __devinit max8997_led_probe(struct platform_device *pdev) { struct max8997_dev *iodev = dev_get_drvdata(pdev->dev.parent); struct max8997_platform_data *pdata = dev_get_platdata(iodev->dev); struct max8997_led *led; char name[20]; int ret = 0; if (pdata == NULL) { dev_err(&pdev->dev, "no platform data\n"); return -ENODEV; } led = kzalloc(sizeof(*led), GFP_KERNEL); if (led == NULL) { ret = -ENOMEM; goto err_mem; } led->id = pdev->id; snprintf(name, sizeof(name), "max8997-led%d", pdev->id); led->cdev.name = name; led->cdev.brightness_set = max8997_led_brightness_set; led->cdev.flags |= LED_CORE_SUSPENDRESUME; led->cdev.brightness = 0; led->iodev = iodev; if (pdata->led_pdata) { u8 mode = 0, brightness = 0; mode = pdata->led_pdata->mode[led->id]; brightness = pdata->led_pdata->brightness[led->id]; max8997_led_set_mode(led, pdata->led_pdata->mode[led->id]); if (brightness > led->cdev.max_brightness) brightness = led->cdev.max_brightness; max8997_led_set_current(led, brightness); led->cdev.brightness = brightness; } else { max8997_led_set_mode(led, MAX8997_NONE); max8997_led_set_current(led, 0); } mutex_init(&led->mutex); platform_set_drvdata(pdev, led); ret = led_classdev_register(&pdev->dev, &led->cdev); if (ret < 0) goto err_led; ret = device_create_file(led->cdev.dev, &dev_attr_mode); if (ret != 0) { dev_err(&pdev->dev, "failed to create file: %d\n", ret); goto err_file; } return 0; err_file: led_classdev_unregister(&led->cdev); err_led: kfree(led); err_mem: return ret; }