static int hisi_thermal_probe(struct platform_device *pdev) { struct hisi_thermal_data *data; int (*platform_probe)(struct hisi_thermal_data *); struct device *dev = &pdev->dev; int ret; data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); if (!data) return -ENOMEM; data->pdev = pdev; platform_set_drvdata(pdev, data); platform_probe = of_device_get_match_data(dev); if (!platform_probe) { dev_err(dev, "failed to get probe func\n"); return -EINVAL; } ret = platform_probe(data); if (ret) return ret; ret = hisi_thermal_register_sensor(pdev, data, &data->sensor); if (ret) { dev_err(dev, "failed to register thermal sensor: %d\n", ret); return ret; } ret = data->enable_sensor(data); if (ret) { dev_err(dev, "Failed to setup the sensor: %d\n", ret); return ret; } if (data->irq) { ret = devm_request_threaded_irq(dev, data->irq, NULL, hisi_thermal_alarm_irq_thread, IRQF_ONESHOT, "hisi_thermal", data); if (ret < 0) { dev_err(dev, "failed to request alarm irq: %d\n", ret); return ret; } } hisi_thermal_toggle_sensor(&data->sensor, true); return 0; }
static int hisi_thermal_probe(struct platform_device *pdev) { struct hisi_thermal_data *data; struct resource *res; int i; int ret; data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); if (!data) return -ENOMEM; mutex_init(&data->thermal_lock); data->pdev = pdev; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); data->regs = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(data->regs)) { dev_err(&pdev->dev, "failed to get io address\n"); return PTR_ERR(data->regs); } data->irq = platform_get_irq(pdev, 0); if (data->irq < 0) return data->irq; ret = devm_request_threaded_irq(&pdev->dev, data->irq, hisi_thermal_alarm_irq, hisi_thermal_alarm_irq_thread, 0, "hisi_thermal", data); if (ret < 0) { dev_err(&pdev->dev, "failed to request alarm irq: %d\n", ret); return ret; } platform_set_drvdata(pdev, data); data->clk = devm_clk_get(&pdev->dev, "thermal_clk"); if (IS_ERR(data->clk)) { ret = PTR_ERR(data->clk); if (ret != -EPROBE_DEFER) dev_err(&pdev->dev, "failed to get thermal clk: %d\n", ret); return ret; } /* enable clock for thermal */ ret = clk_prepare_enable(data->clk); if (ret) { dev_err(&pdev->dev, "failed to enable thermal clk: %d\n", ret); return ret; } hisi_thermal_enable_bind_irq_sensor(data); irq_get_irqchip_state(data->irq, IRQCHIP_STATE_MASKED, &data->irq_enabled); for (i = 0; i < HISI_MAX_SENSORS; ++i) { ret = hisi_thermal_register_sensor(pdev, data, &data->sensors[i], i); if (ret) dev_err(&pdev->dev, "failed to register thermal sensor: %d\n", ret); else hisi_thermal_toggle_sensor(&data->sensors[i], true); } return 0; }