Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
static void compass_hmc5883l_remove(struct device_t * dev)
{
	struct compass_t * c = (struct compass_t *)dev->priv;
	struct compass_hmc5883l_pdata_t * pdat = (struct compass_hmc5883l_pdata_t *)c->priv;

	if(c && unregister_compass(c))
	{
		i2c_device_free(pdat->dev);

		free_device_name(c->name);
		free(c->priv);
		free(c);
	}
}
Пример #4
0
static void gmeter_axdl345_remove(struct device_t * dev)
{
	struct gmeter_t * g = (struct gmeter_t *)dev->priv;
	struct gmeter_axdl345_pdata_t * pdat = (struct gmeter_axdl345_pdata_t *)g->priv;

	if(g && unregister_gmeter(g))
	{
		i2c_device_free(pdat->dev);

		free_device_name(g->name);
		free(g->priv);
		free(g);
	}
}
Пример #5
0
static void battery_sbs_remove(struct device_t * dev)
{
	struct battery_t * bat = (struct battery_t *)dev->priv;
	struct battery_sbs_pdata_t * pdat = (struct battery_sbs_pdata_t *)bat->priv;

	if(bat && unregister_battery(bat))
	{
		i2c_device_free(pdat->dev);

		free_device_name(bat->name);
		free(bat->priv);
		free(bat);
	}
}
Пример #6
0
static void key_rc5t620_remove(struct device_t * dev)
{
	struct input_t * input = (struct input_t *)dev->priv;
	struct key_rc5t620_pdata_t * pdat = (struct key_rc5t620_pdata_t *)input->priv;

	if(input && unregister_input(input))
	{
		free_irq(pdat->irq);
		i2c_device_free(pdat->dev);

		free_device_name(input->name);
		free(input->priv);
		free(input);
	}
}
Пример #7
0
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;
}
Пример #8
0
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;
}