int scx200_i2c_init(void) { printk(KERN_DEBUG NAME ": NatSemi SCx200 I2C Driver\n"); if (!scx200_gpio_present()) { printk(KERN_ERR NAME ": no SCx200 gpio pins available\n"); return -ENODEV; } printk(KERN_DEBUG NAME ": SCL=GPIO%02u, SDA=GPIO%02u\n", scl, sda); if (scl == -1 || sda == -1 || scl == sda) { printk(KERN_ERR NAME ": scl and sda must be specified\n"); return -EINVAL; } /* Configure GPIOs as open collector outputs */ scx200_gpio_configure(scl, ~2, 5); scx200_gpio_configure(sda, ~2, 5); if (i2c_bit_add_bus(&scx200_i2c_ops) < 0) { printk(KERN_ERR NAME ": adapter %s registration failed\n", scx200_i2c_ops.name); return -ENODEV; } return 0; }
static int __init scx200_gpio_init(void) { int rc; dev_t devid; if (!scx200_gpio_present()) { printk(KERN_ERR DRVNAME ": no SCx200 gpio present\n"); return -ENODEV; } /* support dev_dbg() with pdev->dev */ pdev = platform_device_alloc(DRVNAME, 0); if (!pdev) return -ENOMEM; rc = platform_device_add(pdev); if (rc) goto undo_malloc; /* nsc_gpio uses dev_dbg(), so needs this */ scx200_gpio_ops.dev = &pdev->dev; if (major) { devid = MKDEV(major, 0); rc = register_chrdev_region(devid, MAX_PINS, "scx200_gpio"); } else { rc = alloc_chrdev_region(&devid, 0, MAX_PINS, "scx200_gpio"); major = MAJOR(devid); } if (rc < 0) { dev_err(&pdev->dev, "SCx200 chrdev_region err: %d\n", rc); goto undo_platform_device_add; } cdev_init(&scx200_gpio_cdev, &scx200_gpio_fileops); cdev_add(&scx200_gpio_cdev, devid, MAX_PINS); return 0; /* succeed */ undo_platform_device_add: platform_device_del(pdev); undo_malloc: platform_device_put(pdev); return rc; }
static int __init wrap_led_init(void) { int ret; if (!scx200_gpio_present()) { ret = -ENODEV; goto out; } ret = platform_driver_register(&wrap_led_driver); if (ret < 0) goto out; pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0); if (IS_ERR(pdev)) { ret = PTR_ERR(pdev); platform_driver_unregister(&wrap_led_driver); goto out; } out: return ret; }