static void r_tpu_work(struct work_struct *work) { struct r_tpu_priv *p = container_of(work, struct r_tpu_priv, work); enum led_brightness brightness = p->new_brightness; r_tpu_disable(p); /* off and maximum are handled as GPIO pins, in between PWM */ if ((brightness == 0) || (brightness == p->ldev.max_brightness)) r_tpu_set_pin(p, R_TPU_PIN_GPIO, brightness); else { r_tpu_set_pin(p, R_TPU_PIN_GPIO_FN, 0); r_tpu_enable(p, brightness); } }
static void r_tpu_work(struct work_struct *work) { struct r_tpu_priv *p = container_of(work, struct r_tpu_priv, work); enum led_brightness brightness = p->new_brightness; r_tpu_disable(p); if ((brightness == 0) || (brightness == p->ldev.max_brightness)) r_tpu_set_pin(p, R_TPU_PIN_GPIO, brightness); else { r_tpu_set_pin(p, R_TPU_PIN_GPIO_FN, 0); r_tpu_enable(p, brightness); } }
static int r_tpu_remove(struct platform_device *pdev) { struct r_tpu_priv *p = platform_get_drvdata(pdev); r_tpu_set_brightness(&p->ldev, LED_OFF); led_classdev_unregister(&p->ldev); cancel_work_sync(&p->work); r_tpu_disable(p); r_tpu_set_pin(p, R_TPU_PIN_UNUSED, LED_OFF); pm_runtime_disable(&pdev->dev); clk_put(p->clk); iounmap(p->mapbase); return 0; }
static int __devinit r_tpu_probe(struct platform_device *pdev) { struct led_renesas_tpu_config *cfg = pdev->dev.platform_data; struct r_tpu_priv *p; struct resource *res; int ret = -ENXIO; if (!cfg) { dev_err(&pdev->dev, "missing platform data\n"); goto err0; } p = kzalloc(sizeof(*p), GFP_KERNEL); if (p == NULL) { dev_err(&pdev->dev, "failed to allocate driver data\n"); ret = -ENOMEM; goto err0; } res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { dev_err(&pdev->dev, "failed to get I/O memory\n"); goto err1; } /* map memory, let mapbase point to our channel */ p->mapbase = ioremap_nocache(res->start, resource_size(res)); if (p->mapbase == NULL) { dev_err(&pdev->dev, "failed to remap I/O memory\n"); goto err1; } /* get hold of clock */ p->clk = clk_get(&pdev->dev, NULL); if (IS_ERR(p->clk)) { dev_err(&pdev->dev, "cannot get clock\n"); ret = PTR_ERR(p->clk); goto err2; } p->pdev = pdev; p->pin_state = R_TPU_PIN_UNUSED; p->timer_state = R_TPU_TIMER_UNUSED; p->refresh_rate = cfg->refresh_rate ? cfg->refresh_rate : 100; r_tpu_set_pin(p, R_TPU_PIN_GPIO, LED_OFF); platform_set_drvdata(pdev, p); INIT_WORK(&p->work, r_tpu_work); p->ldev.name = cfg->name; p->ldev.brightness = LED_OFF; p->ldev.max_brightness = cfg->max_brightness; p->ldev.brightness_set = r_tpu_set_brightness; p->ldev.flags |= LED_CORE_SUSPENDRESUME; ret = led_classdev_register(&pdev->dev, &p->ldev); if (ret < 0) goto err3; /* max_brightness may be updated by the LED core code */ p->min_rate = p->ldev.max_brightness * p->refresh_rate; pm_runtime_enable(&pdev->dev); return 0; err3: r_tpu_set_pin(p, R_TPU_PIN_UNUSED, LED_OFF); clk_put(p->clk); err2: iounmap(p->mapbase); err1: kfree(p); err0: return ret; }