//[*]--------------------------------------------------------------------------------------------------[*] static int bh1780_resume(struct i2c_client *client) { struct bh1780_data *bh1780 = i2c_get_clientdata(client); bh1780_power_up(bh1780); if(bh1780->enabled) schedule_delayed_work(&bh1780->work, BH1780_WORK_PERIOD); return 0; }
static int bh1780_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct bh1780_data *bh1780; int err; /* setup private data */ bh1780 = kzalloc(sizeof(struct bh1780_data), GFP_KERNEL); if (!bh1780) { err = -ENOMEM; goto error_0; } mutex_init(&bh1780->enable_mutex); mutex_init(&bh1780->data_mutex); /* setup i2c client */ if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { err = -ENODEV; goto error_1; } i2c_set_clientdata(client, bh1780); bh1780->client = client; /* detect and init hardware */ if ((err = bh1780_detect(client, NULL))) { goto error_1; } if((err = i2c_smbus_write_byte(bh1780->client, (BH1780_COMMAND_REG + BH1780_PART_REV_REG))) < 0) { dev_err(&client->dev, "I2C write byte error: data=0x%02x\n", (BH1780_COMMAND_REG + BH1780_PART_REV_REG)); goto error_1; } if((err = i2c_smbus_read_byte(client)) < 0) { dev_err(&client->dev, "I2C read byte error\n"); goto error_1; } dev_info(&client->dev, "%s found\n", id->name); dev_info(&client->dev, "part number=%d, rev=%d\n", ((err >> 4) & 0x0F), (err & 0x0F)); bh1780_power_up(bh1780); bh1780_set_delay(&client->dev, BH1780_DEFAULT_DELAY); /* setup driver interfaces */ INIT_DELAYED_WORK(&bh1780->work, bh1780_work_func); if ((err = bh1780_input_init(bh1780)) < 0) goto error_1; if ((err = sysfs_create_group(&bh1780->input->dev.kobj, &bh1780_attribute_group)) < 0) goto error_2; return 0; error_2: bh1780_input_fini(bh1780); error_1: kfree(bh1780); error_0: return err; }
//[*]--------------------------------------------------------------------------------------------------[*] static int bh1780_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct bh1780_data *bh1780; int err; /* setup private data */ bh1780 = kzalloc(sizeof(struct bh1780_data), GFP_KERNEL); if (!bh1780) { pr_err("%s: failed to allocate memory for module\n", __func__); return -ENOMEM; } i2c_set_clientdata(client, bh1780); dev_set_drvdata(&client->dev, bh1780); bh1780->client = client; /* detect and init hardware */ if ((err = bh1780_detect(client, NULL)) != 0) goto error; if((err = i2c_smbus_write_byte(bh1780->client, (BH1780_COMMAND_REG + BH1780_PART_REV_REG))) < 0) { dev_err(&client->dev, "I2C write byte error: data=0x%02x\n", (BH1780_COMMAND_REG + BH1780_PART_REV_REG)); goto error; } if((err = i2c_smbus_read_byte(client)) < 0) { dev_err(&client->dev, "I2C read byte error\n"); goto error; } dev_info(&client->dev, "%s found\n", id->name); dev_info(&client->dev, "part number=%d, rev=%d\n", ((err >> 4) & 0x0F), (err & 0x0F)); bh1780_power_up(bh1780); INIT_DELAYED_WORK(&bh1780->work, bh1780_work_func); #if defined(CONFIG_ODROID_EXYNOS5_IOBOARD_DEBUG) bh1780->enabled = 1; #endif if(bh1780->enabled) schedule_delayed_work(&bh1780->work, BH1780_WORK_PERIOD); if ((err = sysfs_create_group(&client->dev.kobj, &bh1780_attribute_group)) < 0) goto error; printk("\n=================== ioboard_%s ===================\n\n", __func__); return 0; error: printk("\n=================== ioboard_%s FAIL! ===================\n\n", __func__); return err; }
static int bh1780_resume(struct i2c_client *client) { struct bh1780_data *bh1780 = i2c_get_clientdata(client); int delay = atomic_read(&bh1780->delay); bh1780_power_up(bh1780); bh1780_set_delay(&client->dev, delay); mutex_lock(&bh1780->enable_mutex); if (bh1780_get_enable(&client->dev)) { bh1780_power_up(bh1780); schedule_delayed_work(&bh1780->work, delay_to_jiffies(delay) + 1); } mutex_unlock(&bh1780->enable_mutex); return 0; }
static void bh1780_set_enable(struct device *dev, int enable) { struct i2c_client *client = to_i2c_client(dev); struct bh1780_data *bh1780 = i2c_get_clientdata(client); int delay = atomic_read(&bh1780->delay); mutex_lock(&bh1780->enable_mutex); if (enable) { /* enable if state will be changed */ if (!atomic_cmpxchg(&bh1780->enable, 0, 1)) { bh1780_power_up(bh1780); schedule_delayed_work(&bh1780->work, delay_to_jiffies(delay) + 1); } } else { /* disable if state will be changed */ if (atomic_cmpxchg(&bh1780->enable, 1, 0)) { cancel_delayed_work_sync(&bh1780->work); bh1780_power_down(bh1780); } } atomic_set(&bh1780->enable, enable); mutex_unlock(&bh1780->enable_mutex); }