static struct device_t * battery_sbs_probe(struct driver_t * drv, struct dtnode_t * n) { struct battery_sbs_pdata_t * pdat; struct battery_t * bat; struct device_t * dev; struct i2c_device_t * i2cdev; u16_t val; i2cdev = i2c_device_alloc(dt_read_string(n, "i2c-bus", NULL), dt_read_int(n, "slave-address", 0x0b), 0); if(!i2cdev) return NULL; if(sbs_read_word(i2cdev, SBS_BATTERY_STATUS, &val)) { if(val & (0x1 << 7)) { } } else { i2c_device_free(i2cdev); return NULL; } pdat = malloc(sizeof(struct battery_sbs_pdata_t)); if(!pdat) { i2c_device_free(i2cdev); return NULL; } bat = malloc(sizeof(struct battery_t)); if(!bat) { i2c_device_free(i2cdev); free(pdat); return NULL; } pdat->dev = i2cdev; bat->name = alloc_device_name(dt_read_name(n), -1); bat->update = battery_sbs_update; bat->priv = pdat; if(!register_battery(&dev, bat)) { i2c_device_free(pdat->dev); free_device_name(bat->name); free(bat->priv); free(bat); return NULL; } dev->driver = drv; return dev; }
static struct device_t * gmeter_axdl345_probe(struct driver_t * drv, struct dtnode_t * n) { struct gmeter_axdl345_pdata_t * pdat; struct gmeter_t * g; struct device_t * dev; struct i2c_device_t * i2cdev; u8_t val; i2cdev = i2c_device_alloc(dt_read_string(n, "i2c-bus", NULL), dt_read_int(n, "slave-address", 0x53), 0); if(!i2cdev) return NULL; if(axdl345_read(i2cdev, REG_DEVID, &val) && (val == 0xe5)) { axdl345_write(i2cdev, REG_DATA_FORMAT, 0x0b); axdl345_write(i2cdev, REG_POWER_CTL, 0x08); axdl345_write(i2cdev, REG_INT_ENABLE, 0x80); } else { i2c_device_free(i2cdev); return NULL; } pdat = malloc(sizeof(struct gmeter_axdl345_pdata_t)); if(!pdat) { i2c_device_free(i2cdev); return NULL; } g = malloc(sizeof(struct gmeter_t)); if(!g) { i2c_device_free(i2cdev); free(pdat); return NULL; } pdat->dev = i2cdev; g->name = alloc_device_name(dt_read_name(n), -1); g->get = gmeter_axdl345_get; g->priv = pdat; if(!register_gmeter(&dev, g)) { i2c_device_free(pdat->dev); free_device_name(g->name); free(g->priv); free(g); return NULL; } dev->driver = drv; return dev; }
static struct device_t * compass_hmc5883l_probe(struct driver_t * drv, struct dtnode_t * n) { struct compass_hmc5883l_pdata_t * pdat; struct compass_t * c; struct device_t * dev; struct i2c_device_t * i2cdev; u8_t ida, idb, idc; i2cdev = i2c_device_alloc(dt_read_string(n, "i2c-bus", NULL), dt_read_int(n, "slave-address", 0x1e), 0); if(!i2cdev) return NULL; if(hmc5883l_read(i2cdev, REG_IDA, &ida) && hmc5883l_read(i2cdev, REG_IDB, &idb) && hmc5883l_read(i2cdev, REG_IDC, &idc) && (ida == 0x48) && (idb == 0x34) && (idc == 0x33)) { hmc5883l_write(i2cdev, REG_CFGA, 0x70); hmc5883l_write(i2cdev, REG_CFGB, 0x20); hmc5883l_write(i2cdev, REG_MODE, 0x00); } else { i2c_device_free(i2cdev); return NULL; } pdat = malloc(sizeof(struct compass_hmc5883l_pdata_t)); if(!pdat) { i2c_device_free(i2cdev); return NULL; } c = malloc(sizeof(struct compass_t)); if(!c) { i2c_device_free(i2cdev); free(pdat); return NULL; } pdat->dev = i2cdev; c->name = alloc_device_name(dt_read_name(n), -1); c->ox = 0; c->oy = 0; c->oz = 0; c->get = compass_hmc5883l_get; c->priv = pdat; if(!register_compass(&dev, c)) { i2c_device_free(pdat->dev); free_device_name(c->name); free(c->priv); free(c); return NULL; } dev->driver = drv; return dev; }
static struct device_t * key_rc5t620_probe(struct driver_t * drv, struct dtnode_t * n) { struct key_rc5t620_pdata_t * pdat; struct input_t * input; struct device_t * dev; struct i2c_device_t * i2cdev; int gpio = dt_read_int(n, "interrupt-gpio", -1); int irq = gpio_to_irq(gpio); u8_t val; if(!gpio_is_valid(gpio) || !irq_is_valid(irq)) return NULL; i2cdev = i2c_device_alloc(dt_read_string(n, "i2c-bus", NULL), dt_read_int(n, "slave-address", 0x32), 0); if(!i2cdev) return NULL; if(rc5t620_read(i2cdev, RC5T620_LSIVER, &val) && (val == 0x03)) { rc5t620_write(i2cdev, RC5T620_PWRIRQ, 0x00); rc5t620_write(i2cdev, RC5T620_PWRIRSEL, 0x01); rc5t620_write(i2cdev, RC5T620_INTEN, 0x01); rc5t620_write(i2cdev, RC5T620_PWRIREN, 0x01); } else { i2c_device_free(i2cdev); return NULL; } pdat = malloc(sizeof(struct key_rc5t620_pdata_t)); if(!pdat) { i2c_device_free(i2cdev); return NULL; } input = malloc(sizeof(struct input_t)); if(!input) { i2c_device_free(i2cdev); free(pdat); return NULL; } pdat->dev = i2cdev; pdat->irq = irq; input->name = alloc_device_name(dt_read_name(n), dt_read_id(n)); input->type = INPUT_TYPE_KEYBOARD; input->ioctl = key_rc5t620_ioctl; input->priv = pdat; gpio_set_pull(gpio, GPIO_PULL_UP); gpio_direction_input(gpio); request_irq(pdat->irq, key_rc5t620_interrupt, IRQ_TYPE_EDGE_FALLING, input); if(!register_input(&dev, input)) { free_irq(pdat->irq); i2c_device_free(pdat->dev); free_device_name(input->name); free(input->priv); free(input); return NULL; } dev->driver = drv; return dev; }