Exemple #1
0
static int rx8010_probe(struct i2c_client *client,
			const struct i2c_device_id *id)
{
	struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
	struct rx8010_data *rx8010;
	int err = 0;

	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA
		| I2C_FUNC_SMBUS_I2C_BLOCK)) {
		dev_err(&adapter->dev, "doesn't support required functionality\n");
		return -EIO;
	}

	rx8010 = devm_kzalloc(&client->dev, sizeof(struct rx8010_data),
			      GFP_KERNEL);
	if (!rx8010)
		return -ENOMEM;

	rx8010->client = client;
	i2c_set_clientdata(client, rx8010);

	err = rx8010_init_client(client);
	if (err)
		return err;

	if (client->irq > 0) {
		dev_info(&client->dev, "IRQ %d supplied\n", client->irq);
		err = devm_request_threaded_irq(&client->dev, client->irq, NULL,
						rx8010_irq_1_handler,
						IRQF_TRIGGER_LOW | IRQF_ONESHOT,
						"rx8010", client);

		if (err) {
			dev_err(&client->dev, "unable to request IRQ\n");
			client->irq = 0;
		} else {
			rx8010_rtc_ops.read_alarm = rx8010_read_alarm;
			rx8010_rtc_ops.set_alarm = rx8010_set_alarm;
			rx8010_rtc_ops.alarm_irq_enable = rx8010_alarm_irq_enable;
		}
	}

	rx8010->rtc = devm_rtc_device_register(&client->dev, client->name,
		&rx8010_rtc_ops, THIS_MODULE);

	if (IS_ERR(rx8010->rtc)) {
		dev_err(&client->dev, "unable to register the class device\n");
		return PTR_ERR(rx8010->rtc);
	}

	rx8010->rtc->max_user_freq = 1;

	return err;
}
Exemple #2
0
//----------------------------------------------------------------------
// rx8010_probe()
// probe routine for the rx8010 driver
//
// Todo: - maybe change kzalloc to use devm_kzalloc
//       -
//----------------------------------------------------------------------
static int rx8010_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
	struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
	struct rx8010_data *rx8010;
	int err, need_reset = 0;

	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_I2C_BLOCK)) {
		dev_err(&adapter->dev, "doesn't support required functionality\n");
		err = -EIO;
		goto errout;
	}

	rx8010 = kzalloc(sizeof(*rx8010), GFP_KERNEL);
	if (!rx8010) {
		dev_err(&adapter->dev, "failed to alloc memory\n");
		err = -ENOMEM;
		goto errout;
	}

	rx8010->client = client;
	i2c_set_clientdata(client, rx8010);
	INIT_WORK(&rx8010->work, rx8010_work);

	err = rx8010_init_client(client, &need_reset);
	if (err)
		goto errout_free;

	if (need_reset) {
		struct rtc_time tm;
		dev_info(&client->dev, "bad conditions detected, resetting date\n");
		rtc_time_to_tm(0, &tm);		// set to 1970/1/1
		rx8010_set_time(&client->dev, &tm);
	}

	rx8010->rtc = rtc_device_register(client->name, &client->dev, &rx8010_rtc_ops, THIS_MODULE);
	if (IS_ERR(rx8010->rtc)) {
		err = PTR_ERR(rx8010->rtc);
		dev_err(&client->dev, "unable to register the class device\n");
		goto errout_free;
	}

	if (client->irq > 0) {
		dev_info(&client->dev, "IRQ %d supplied\n", client->irq);
		err = request_irq(client->irq, rx8010_irq, 0, "rx8010", client);
		if (err) {
			dev_err(&client->dev, "unable to request IRQ\n");
			goto errout_reg;
		}
	}

	rx8010->rtc->irq_freq = 1;
	rx8010->rtc->max_user_freq = 1;

	return 0;

//	if (client->irq > 0)
//		free_irq(client->irq, client);

errout_reg:
	rtc_device_unregister(rx8010->rtc);

errout_free:
	kfree(rx8010);

errout:
	dev_err(&adapter->dev, "probing for rx8010 failed\n");
	return err;
}