static void i2c_parport_attach (struct parport *port) { struct i2c_par *adapter; adapter = kmalloc(sizeof(struct i2c_par), GFP_KERNEL); if (adapter == NULL) { printk(KERN_ERR "i2c-parport: Failed to kmalloc\n"); return; } memset(adapter, 0x00, sizeof(struct i2c_par)); pr_debug("i2c-parport: attaching to %s\n", port->name); adapter->pdev = parport_register_device(port, "i2c-parport", NULL, NULL, NULL, PARPORT_FLAG_EXCL, NULL); if (!adapter->pdev) { printk(KERN_ERR "i2c-parport: Unable to register with parport\n"); goto ERROR0; } /* Fill the rest of the structure */ adapter->adapter = parport_adapter; adapter->algo_data = parport_algo_data; if (!adapter_parm[type].getscl.val) adapter->algo_data.getscl = NULL; adapter->algo_data.data = port; adapter->adapter.algo_data = &adapter->algo_data; if (parport_claim_or_block(adapter->pdev) < 0) { printk(KERN_ERR "i2c-parport: Could not claim parallel port\n"); goto ERROR1; } /* Reset hardware to a sane state (SCL and SDA high) */ parport_setsda(port, 1); parport_setscl(port, 1); /* Other init if needed (power on...) */ if (adapter_parm[type].init.val) line_set(port, 1, &adapter_parm[type].init); parport_release(adapter->pdev); if (i2c_bit_add_bus(&adapter->adapter) < 0) { printk(KERN_ERR "i2c-parport: Unable to register with I2C\n"); goto ERROR1; } /* Add the new adapter to the list */ adapter->next = adapter_list; adapter_list = adapter; return; ERROR1: parport_unregister_device(adapter->pdev); ERROR0: kfree(adapter); }
static int __devinit i2c_parport_probe(struct platform_device *pdev) { int err; /* Reset hardware to a sane state (SCL and SDA high) */ parport_setsda(NULL, 1); parport_setscl(NULL, 1); /* Other init if needed (power on...) */ if (adapter_parm[type].init.val) line_set(1, &adapter_parm[type].init); parport_adapter.dev.parent = &pdev->dev; err = i2c_bit_add_bus(&parport_adapter); if (err) dev_err(&pdev->dev, "Unable to register with I2C\n"); return err; }
static int __devinit i2c_parport_probe(struct platform_device *pdev) { int err; parport_setsda(NULL, 1); parport_setscl(NULL, 1); if (adapter_parm[type].init.val) line_set(1, &adapter_parm[type].init); parport_adapter.dev.parent = &pdev->dev; err = i2c_bit_add_bus(&parport_adapter); if (err) dev_err(&pdev->dev, "Unable to register with I2C\n"); return err; }
static int __init i2c_parport_init(void) { if (type < 0) { printk(KERN_WARNING "i2c-parport: adapter type unspecified\n"); return -ENODEV; } if (type >= ARRAY_SIZE(adapter_parm)) { printk(KERN_WARNING "i2c-parport: invalid type (%d)\n", type); return -ENODEV; } if (base == 0) { printk(KERN_INFO "i2c-parport: using default base 0x%x\n", DEFAULT_BASE); base = DEFAULT_BASE; } if (!request_region(base, 3, "i2c-parport")) return -ENODEV; if (!adapter_parm[type].getscl.val) parport_algo_data.getscl = NULL; /* Reset hardware to a sane state (SCL and SDA high) */ parport_setsda(NULL, 1); parport_setscl(NULL, 1); /* Other init if needed (power on...) */ if (adapter_parm[type].init.val) line_set(1, &adapter_parm[type].init); if (i2c_bit_add_bus(&parport_adapter) < 0) { printk(KERN_ERR "i2c-parport: Unable to register with I2C\n"); release_region(base, 3); return -ENODEV; } return 0; }