From a42e53728d598cab4a83c3dc46d13ebed80dbff9 Mon Sep 17 00:00:00 2001 From: Martin Stein Date: Thu, 2 Mar 2017 12:29:20 +0100 Subject: [PATCH] imx sd_card: move to new Mmio::wait_for --- .../os/src/drivers/sd_card/spec/imx/driver.cc | 29 ++++++++++--------- .../os/src/drivers/sd_card/spec/imx/driver.h | 2 +- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/repos/os/src/drivers/sd_card/spec/imx/driver.cc b/repos/os/src/drivers/sd_card/spec/imx/driver.cc index 08269722e2..8197e8399b 100644 --- a/repos/os/src/drivers/sd_card/spec/imx/driver.cc +++ b/repos/os/src/drivers/sd_card/spec/imx/driver.cc @@ -105,9 +105,8 @@ void Driver::_handle_irq() * done with other controllers - isn't sufficient. Instead, both "Transfer * Complete" and "Command Complete" must be gathered. */ - if (!wait_for(1, _delayer) || - !wait_for(1, _delayer)) - { + try { wait_for(_delayer, Irqstat::Cc::Equal(1), Irqstat::Tc::Equal(1)); } + catch (Polling_timeout) { error("Completion host signal timed out"); throw -1; } @@ -127,7 +126,9 @@ void Driver::_handle_irq() int Driver::_wait_for_cmd_complete() { - if (!wait_for(1, _delayer, 200, 5000)) { + try { wait_for(Attempts(200), Microseconds(5000), _delayer, + Irqstat::Cc::Equal(1)); } + catch (Polling_timeout) { error("command timed out"); return -1; } @@ -276,11 +277,11 @@ int Driver::_wait_for_cmd_allowed() * "Auto Command 12", waiting only for "Command Inhibit" isn't sufficient * as "Data Line Active" and "Data Inhibit" may also be active. */ - if (!wait_for(0, _delayer) || - !wait_for(1, _delayer) || - !wait_for(0, _delayer) || - !wait_for(0, _delayer)) - { + try { wait_for(_delayer, Prsstat::Dla::Equal(0), + Prsstat::Sdstb::Equal(1), + Prsstat::Cihb::Equal(0), + Prsstat::Cdihb::Equal(0)); } + catch (Polling_timeout) { error("wait till issuing a new command is allowed timed out"); return -1; } @@ -295,7 +296,8 @@ Card_info Driver::_init() _irq.ack_irq(); /* configure host for initialization stage */ - if (_reset(_delayer)) { _detect_err("Host reset failed"); } + if (_reset()) { + _detect_err("Host reset failed"); } _disable_irqs(); if (!_supported_host_version(Mmio::read())) { @@ -429,14 +431,15 @@ void Driver::_detect_err(char const * const err) } -int Driver::_reset(Delayer &delayer) +int Driver::_reset() { /* start reset */ Mmio::write(1); _reset_amendments(); /* wait for reset completion */ - if (!wait_for(0, delayer)) { + try { wait_for(_delayer, Sysctl::Rsta::Equal(0)); } + catch (Polling_timeout) { error("Reset timed out"); return -1; } @@ -521,7 +524,7 @@ void Driver::_enable_clock(Clock_divider divider) void Driver::_clock(Clock clock) { - wait_for(1, _delayer); + wait_for(_delayer, Prsstat::Sdstb::Equal(1)); _disable_clock(); _clock_finish(clock); } diff --git a/repos/os/src/drivers/sd_card/spec/imx/driver.h b/repos/os/src/drivers/sd_card/spec/imx/driver.h index dd3e2e80b9..62cea2b78a 100644 --- a/repos/os/src/drivers/sd_card/spec/imx/driver.h +++ b/repos/os/src/drivers/sd_card/spec/imx/driver.h @@ -234,7 +234,7 @@ class Sd_card::Driver : public Driver_base, void _enable_clock_finish(); void _clock(Clock clock); void _clock_finish(Clock clock); - int _reset(Delayer & delayer); + int _reset(); void _reset_amendments(); int _wait_for_cmd_allowed(); int _wait_for_cmd_complete();