static int ttl_probe(struct platform_device *pdev) { struct janz_platform_data *pdata; struct device *dev = &pdev->dev; struct ttl_module *mod; struct gpio_chip *gpio; struct resource *res; int ret; pdata = dev_get_platdata(&pdev->dev); if (!pdata) { dev_err(dev, "no platform data\n"); return -ENXIO; } mod = devm_kzalloc(dev, sizeof(*mod), GFP_KERNEL); if (!mod) return -ENOMEM; platform_set_drvdata(pdev, mod); spin_lock_init(&mod->lock); /* get access to the MODULbus registers for this module */ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); mod->regs = devm_ioremap_resource(dev, res); if (IS_ERR(mod->regs)) return PTR_ERR(mod->regs); ttl_setup_device(mod); /* Initialize the GPIO data structures */ gpio = &mod->gpio; gpio->parent = &pdev->dev; gpio->label = pdev->name; gpio->get = ttl_get_value; gpio->set = ttl_set_value; gpio->owner = THIS_MODULE; /* request dynamic allocation */ gpio->base = -1; gpio->ngpio = 20; ret = devm_gpiochip_add_data(dev, gpio, NULL); if (ret) { dev_err(dev, "unable to add GPIO chip\n"); return ret; } return 0; }
static int __devinit ttl_probe(struct platform_device *pdev) { struct janz_platform_data *pdata; struct device *dev = &pdev->dev; struct ttl_module *mod; struct gpio_chip *gpio; struct resource *res; int ret; pdata = pdev->dev.platform_data; if (!pdata) { dev_err(dev, "no platform data\n"); ret = -ENXIO; goto out_return; } mod = kzalloc(sizeof(*mod), GFP_KERNEL); if (!mod) { dev_err(dev, "unable to allocate private data\n"); ret = -ENOMEM; goto out_return; } platform_set_drvdata(pdev, mod); spin_lock_init(&mod->lock); /* get access to the MODULbus registers for this module */ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { dev_err(dev, "MODULbus registers not found\n"); ret = -ENODEV; goto out_free_mod; } mod->regs = ioremap(res->start, resource_size(res)); if (!mod->regs) { dev_err(dev, "MODULbus registers not ioremap\n"); ret = -ENOMEM; goto out_free_mod; } ttl_setup_device(mod); /* Initialize the GPIO data structures */ gpio = &mod->gpio; gpio->dev = &pdev->dev; gpio->label = pdev->name; gpio->get = ttl_get_value; gpio->set = ttl_set_value; gpio->owner = THIS_MODULE; /* request dynamic allocation */ gpio->base = -1; gpio->ngpio = 20; ret = gpiochip_add(gpio); if (ret) { dev_err(dev, "unable to add GPIO chip\n"); goto out_iounmap_regs; } return 0; out_iounmap_regs: iounmap(mod->regs); out_free_mod: kfree(mod); out_return: return ret; }