static int __devinit sh_cmt_probe(struct platform_device *pdev) { struct sh_cmt_priv *p = platform_get_drvdata(pdev); int ret; if (!is_early_platform_device(pdev)) pm_genpd_dev_always_on(&pdev->dev, true); if (p) { dev_info(&pdev->dev, "kept as earlytimer\n"); return 0; } p = kmalloc(sizeof(*p), GFP_KERNEL); if (p == NULL) { dev_err(&pdev->dev, "failed to allocate driver data\n"); return -ENOMEM; } ret = sh_cmt_setup(p, pdev); if (ret) { kfree(p); platform_set_drvdata(pdev, NULL); } return ret; }
static int sh_cmt_probe(struct platform_device *pdev) { struct sh_cmt_priv *p = platform_get_drvdata(pdev); struct sh_timer_config *cfg = pdev->dev.platform_data; int ret; if (!is_early_platform_device(pdev)) { pm_runtime_set_active(&pdev->dev); pm_runtime_enable(&pdev->dev); } if (p) { dev_info(&pdev->dev, "kept as earlytimer\n"); goto out; } p = kmalloc(sizeof(*p), GFP_KERNEL); if (p == NULL) { dev_err(&pdev->dev, "failed to allocate driver data\n"); return -ENOMEM; } ret = sh_cmt_setup(p, pdev); if (ret) { kfree(p); pm_runtime_idle(&pdev->dev); return ret; } if (is_early_platform_device(pdev)) return 0; out: if (cfg->clockevent_rating || cfg->clocksource_rating) pm_runtime_irq_safe(&pdev->dev); else pm_runtime_idle(&pdev->dev); return 0; }
static int sh_tmu_probe(struct platform_device *pdev) { struct sh_tmu_device *tmu = platform_get_drvdata(pdev); int ret; if (!is_early_platform_device(pdev)) { pm_runtime_set_active(&pdev->dev); pm_runtime_enable(&pdev->dev); } if (tmu) { dev_info(&pdev->dev, "kept as earlytimer\n"); goto out; } tmu = kzalloc(sizeof(*tmu), GFP_KERNEL); if (tmu == NULL) return -ENOMEM; ret = sh_tmu_setup(tmu, pdev); if (ret) { kfree(tmu); pm_runtime_idle(&pdev->dev); return ret; } if (is_early_platform_device(pdev)) return 0; out: if (tmu->has_clockevent || tmu->has_clocksource) pm_runtime_irq_safe(&pdev->dev); else pm_runtime_idle(&pdev->dev); return 0; }
static int bfin_serial_probe(struct platform_device *pdev) { struct resource *res; struct bfin_serial_port *uart = NULL; int ret = 0; if (pdev->id < 0 || pdev->id >= BFIN_UART_NR_PORTS) { dev_err(&pdev->dev, "Wrong bfin uart platform device id.\n"); return -ENOENT; } if (bfin_serial_ports[pdev->id] == NULL) { uart = kzalloc(sizeof(*uart), GFP_KERNEL); if (!uart) { dev_err(&pdev->dev, "fail to malloc bfin_serial_port\n"); return -ENOMEM; } bfin_serial_ports[pdev->id] = uart; #ifdef CONFIG_EARLY_PRINTK if (!(bfin_earlyprintk_port.port.membase && bfin_earlyprintk_port.port.line == pdev->id)) { /* * If the peripheral PINs of current port is allocated * in earlyprintk probe stage, don't do it again. */ #endif ret = peripheral_request_list( (unsigned short *)pdev->dev.platform_data, DRIVER_NAME); if (ret) { dev_err(&pdev->dev, "fail to request bfin serial peripherals\n"); goto out_error_free_mem; } #ifdef CONFIG_EARLY_PRINTK } #endif spin_lock_init(&uart->port.lock); uart->port.uartclk = get_sclk(); uart->port.fifosize = BFIN_UART_TX_FIFO_SIZE; uart->port.ops = &bfin_serial_pops; uart->port.line = pdev->id; uart->port.iotype = UPIO_MEM; uart->port.flags = UPF_BOOT_AUTOCONF; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (res == NULL) { dev_err(&pdev->dev, "Cannot get IORESOURCE_MEM\n"); ret = -ENOENT; goto out_error_free_peripherals; } uart->port.membase = ioremap(res->start, res->end - res->start); if (!uart->port.membase) { dev_err(&pdev->dev, "Cannot map uart IO\n"); ret = -ENXIO; goto out_error_free_peripherals; } uart->port.mapbase = res->start; uart->port.irq = platform_get_irq(pdev, 0); if (uart->port.irq < 0) { dev_err(&pdev->dev, "No uart RX/TX IRQ specified\n"); ret = -ENOENT; goto out_error_unmap; } uart->status_irq = platform_get_irq(pdev, 1); if (uart->status_irq < 0) { dev_err(&pdev->dev, "No uart status IRQ specified\n"); ret = -ENOENT; goto out_error_unmap; } #ifdef CONFIG_SERIAL_BFIN_DMA spin_lock_init(&uart->rx_lock); uart->tx_done = 1; uart->tx_count = 0; res = platform_get_resource(pdev, IORESOURCE_DMA, 0); if (res == NULL) { dev_err(&pdev->dev, "No uart TX DMA channel specified\n"); ret = -ENOENT; goto out_error_unmap; } uart->tx_dma_channel = res->start; res = platform_get_resource(pdev, IORESOURCE_DMA, 1); if (res == NULL) { dev_err(&pdev->dev, "No uart RX DMA channel specified\n"); ret = -ENOENT; goto out_error_unmap; } uart->rx_dma_channel = res->start; init_timer(&(uart->rx_dma_timer)); #endif #if defined(CONFIG_SERIAL_BFIN_CTSRTS) || \ defined(CONFIG_SERIAL_BFIN_HARD_CTSRTS) res = platform_get_resource(pdev, IORESOURCE_IO, 0); if (res == NULL) uart->cts_pin = -1; else uart->cts_pin = res->start; res = platform_get_resource(pdev, IORESOURCE_IO, 1); if (res == NULL) uart->rts_pin = -1; else uart->rts_pin = res->start; # if defined(CONFIG_SERIAL_BFIN_CTSRTS) if (uart->rts_pin >= 0) gpio_request(uart->rts_pin, DRIVER_NAME); # endif #endif } #ifdef CONFIG_SERIAL_BFIN_CONSOLE if (!is_early_platform_device(pdev)) { #endif uart = bfin_serial_ports[pdev->id]; uart->port.dev = &pdev->dev; dev_set_drvdata(&pdev->dev, uart); ret = uart_add_one_port(&bfin_serial_reg, &uart->port); #ifdef CONFIG_SERIAL_BFIN_CONSOLE } #endif if (!ret) return 0; if (uart) { out_error_unmap: iounmap(uart->port.membase); out_error_free_peripherals: peripheral_free_list( (unsigned short *)pdev->dev.platform_data); out_error_free_mem: kfree(uart); bfin_serial_ports[pdev->id] = NULL; } return ret; }