.. | .. |
---|
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, |
---|