static int abx500_temp_probe(struct platform_device *pdev) { struct abx500_temp *data; int err; data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); if (!data) return -ENOMEM; data->pdev = pdev; mutex_init(&data->lock); /* Chip specific initialization */ err = abx500_hwmon_init(data); if (err < 0 || !data->ops.read_sensor || !data->ops.show_name || !data->ops.show_label) return err; INIT_DEFERRABLE_WORK(&data->work, gpadc_monitor); platform_set_drvdata(pdev, data); err = sysfs_create_group(&pdev->dev.kobj, &abx500_temp_group); if (err < 0) { dev_err(&pdev->dev, "Create sysfs group failed (%d)\n", err); return err; } data->hwmon_dev = hwmon_device_register(&pdev->dev); if (IS_ERR(data->hwmon_dev)) { err = PTR_ERR(data->hwmon_dev); dev_err(&pdev->dev, "Class registration failed (%d)\n", err); goto exit_sysfs_group; } if (data->ops.irq_handler) { err = setup_irqs(pdev); if (err < 0) goto exit_hwmon_reg; } return 0; exit_hwmon_reg: hwmon_device_unregister(data->hwmon_dev); exit_sysfs_group: sysfs_remove_group(&pdev->dev.kobj, &abx500_temp_group); return err; }
static int __devinit ab8500_temp_probe(struct platform_device *pdev) { struct ab8500_temp *data; int err; data = kzalloc(sizeof(struct ab8500_temp), GFP_KERNEL); if (!data) return -ENOMEM; data->gpadc = ab8500_gpadc_get(); data->hwmon_dev = hwmon_device_register(&pdev->dev); if (IS_ERR(data->hwmon_dev)) { err = PTR_ERR(data->hwmon_dev); dev_err(&pdev->dev, "Class registration failed (%d)\n", err); goto exit; } INIT_DELAYED_WORK_DEFERRABLE(&data->work, gpadc_monitor); INIT_DELAYED_WORK(&data->power_off_work, thermal_power_off); /* * Setup HW defined data. * * Reference hardware (HREF): * * GPADC - ADC_AUX1, connected to NTC R2148 next to RTC_XTAL on HREF * GPADC - ADC_AUX2, connected to NTC R2150 near DB8500 on HREF * Hence, temp#_min/max/max_hyst refer to millivolts and not * millidegrees * * HREF HW does not support reading AB8500 temperature. BUT an * AB8500 IRQ will be launched if die crit temp limit is reached. * * Also: * Battery temperature (BatTemp and BatCtrl) thresholds will * not be exposed via hwmon. * * Make sure indexes correspond to the attribute indexes * used when calling SENSOR_DEVICE_ATRR */ data->gpadc_addr[0] = ADC_AUX1; data->gpadc_addr[1] = ADC_AUX2; data->gpadc_addr[2] = BTEMP_BALL; data->gpadc_addr[4] = BAT_CTRL; mutex_init(&data->lock); data->pdev = pdev; data->power_off_delay = DEFAULT_POWER_OFF_DELAY; platform_set_drvdata(pdev, data); err = sysfs_create_group(&pdev->dev.kobj, &ab8500_temp_group); if (err < 0) { dev_err(&pdev->dev, "Create sysfs group failed (%d)\n", err); goto exit_platform_data; } err = setup_irqs(pdev); if (err < 0) goto exit_platform_data; return 0; exit_platform_data: platform_set_drvdata(pdev, NULL); exit: kfree(data); return err; }