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; }
//---------------------------------------------------------------------- // 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; }