| .. | .. |
|---|
| 318 | 318 | return ret; |
|---|
| 319 | 319 | } |
|---|
| 320 | 320 | |
|---|
| 321 | +static void sun8i_ths_reset_control_assert(void *data) |
|---|
| 322 | +{ |
|---|
| 323 | + reset_control_assert(data); |
|---|
| 324 | +} |
|---|
| 325 | + |
|---|
| 321 | 326 | static int sun8i_ths_resource_init(struct ths_device *tmdev) |
|---|
| 322 | 327 | { |
|---|
| 323 | 328 | struct device *dev = tmdev->dev; |
|---|
| .. | .. |
|---|
| 338 | 343 | if (IS_ERR(tmdev->reset)) |
|---|
| 339 | 344 | return PTR_ERR(tmdev->reset); |
|---|
| 340 | 345 | |
|---|
| 341 | | - tmdev->bus_clk = devm_clk_get(&pdev->dev, "bus"); |
|---|
| 346 | + ret = reset_control_deassert(tmdev->reset); |
|---|
| 347 | + if (ret) |
|---|
| 348 | + return ret; |
|---|
| 349 | + |
|---|
| 350 | + ret = devm_add_action_or_reset(dev, sun8i_ths_reset_control_assert, |
|---|
| 351 | + tmdev->reset); |
|---|
| 352 | + if (ret) |
|---|
| 353 | + return ret; |
|---|
| 354 | + |
|---|
| 355 | + tmdev->bus_clk = devm_clk_get_enabled(&pdev->dev, "bus"); |
|---|
| 342 | 356 | if (IS_ERR(tmdev->bus_clk)) |
|---|
| 343 | 357 | return PTR_ERR(tmdev->bus_clk); |
|---|
| 344 | 358 | } |
|---|
| 345 | 359 | |
|---|
| 346 | 360 | if (tmdev->chip->has_mod_clk) { |
|---|
| 347 | | - tmdev->mod_clk = devm_clk_get(&pdev->dev, "mod"); |
|---|
| 361 | + tmdev->mod_clk = devm_clk_get_enabled(&pdev->dev, "mod"); |
|---|
| 348 | 362 | if (IS_ERR(tmdev->mod_clk)) |
|---|
| 349 | 363 | return PTR_ERR(tmdev->mod_clk); |
|---|
| 350 | 364 | } |
|---|
| 351 | 365 | |
|---|
| 352 | | - ret = reset_control_deassert(tmdev->reset); |
|---|
| 366 | + ret = clk_set_rate(tmdev->mod_clk, 24000000); |
|---|
| 353 | 367 | if (ret) |
|---|
| 354 | 368 | return ret; |
|---|
| 355 | 369 | |
|---|
| 356 | | - ret = clk_prepare_enable(tmdev->bus_clk); |
|---|
| 357 | | - if (ret) |
|---|
| 358 | | - goto assert_reset; |
|---|
| 359 | | - |
|---|
| 360 | | - ret = clk_set_rate(tmdev->mod_clk, 24000000); |
|---|
| 361 | | - if (ret) |
|---|
| 362 | | - goto bus_disable; |
|---|
| 363 | | - |
|---|
| 364 | | - ret = clk_prepare_enable(tmdev->mod_clk); |
|---|
| 365 | | - if (ret) |
|---|
| 366 | | - goto bus_disable; |
|---|
| 367 | | - |
|---|
| 368 | 370 | ret = sun8i_ths_calibrate(tmdev); |
|---|
| 369 | 371 | if (ret) |
|---|
| 370 | | - goto mod_disable; |
|---|
| 372 | + return ret; |
|---|
| 371 | 373 | |
|---|
| 372 | 374 | return 0; |
|---|
| 373 | | - |
|---|
| 374 | | -mod_disable: |
|---|
| 375 | | - clk_disable_unprepare(tmdev->mod_clk); |
|---|
| 376 | | -bus_disable: |
|---|
| 377 | | - clk_disable_unprepare(tmdev->bus_clk); |
|---|
| 378 | | -assert_reset: |
|---|
| 379 | | - reset_control_assert(tmdev->reset); |
|---|
| 380 | | - |
|---|
| 381 | | - return ret; |
|---|
| 382 | 375 | } |
|---|
| 383 | 376 | |
|---|
| 384 | 377 | static int sun8i_h3_thermal_init(struct ths_device *tmdev) |
|---|
| .. | .. |
|---|
| 529 | 522 | return 0; |
|---|
| 530 | 523 | } |
|---|
| 531 | 524 | |
|---|
| 532 | | -static int sun8i_ths_remove(struct platform_device *pdev) |
|---|
| 533 | | -{ |
|---|
| 534 | | - struct ths_device *tmdev = platform_get_drvdata(pdev); |
|---|
| 535 | | - |
|---|
| 536 | | - clk_disable_unprepare(tmdev->mod_clk); |
|---|
| 537 | | - clk_disable_unprepare(tmdev->bus_clk); |
|---|
| 538 | | - reset_control_assert(tmdev->reset); |
|---|
| 539 | | - |
|---|
| 540 | | - return 0; |
|---|
| 541 | | -} |
|---|
| 542 | | - |
|---|
| 543 | 525 | static const struct ths_thermal_chip sun8i_a83t_ths = { |
|---|
| 544 | 526 | .sensor_num = 3, |
|---|
| 545 | 527 | .scale = 705, |
|---|
| .. | .. |
|---|
| 641 | 623 | |
|---|
| 642 | 624 | static struct platform_driver ths_driver = { |
|---|
| 643 | 625 | .probe = sun8i_ths_probe, |
|---|
| 644 | | - .remove = sun8i_ths_remove, |
|---|
| 645 | 626 | .driver = { |
|---|
| 646 | 627 | .name = "sun8i-thermal", |
|---|
| 647 | 628 | .of_match_table = of_ths_match, |
|---|