mirror of
https://github.com/genodelabs/genode.git
synced 2025-02-22 10:21:04 +00:00
imx sd_card: move to new Mmio::wait_for
This commit is contained in:
parent
acf762ec9f
commit
a42e53728d
@ -105,9 +105,8 @@ void Driver::_handle_irq()
|
|||||||
* done with other controllers - isn't sufficient. Instead, both "Transfer
|
* done with other controllers - isn't sufficient. Instead, both "Transfer
|
||||||
* Complete" and "Command Complete" must be gathered.
|
* Complete" and "Command Complete" must be gathered.
|
||||||
*/
|
*/
|
||||||
if (!wait_for<Irqstat::Cc>(1, _delayer) ||
|
try { wait_for(_delayer, Irqstat::Cc::Equal(1), Irqstat::Tc::Equal(1)); }
|
||||||
!wait_for<Irqstat::Tc>(1, _delayer))
|
catch (Polling_timeout) {
|
||||||
{
|
|
||||||
error("Completion host signal timed out");
|
error("Completion host signal timed out");
|
||||||
throw -1;
|
throw -1;
|
||||||
}
|
}
|
||||||
@ -127,7 +126,9 @@ void Driver::_handle_irq()
|
|||||||
|
|
||||||
int Driver::_wait_for_cmd_complete()
|
int Driver::_wait_for_cmd_complete()
|
||||||
{
|
{
|
||||||
if (!wait_for<Irqstat::Cc>(1, _delayer, 200, 5000)) {
|
try { wait_for(Attempts(200), Microseconds(5000), _delayer,
|
||||||
|
Irqstat::Cc::Equal(1)); }
|
||||||
|
catch (Polling_timeout) {
|
||||||
error("command timed out");
|
error("command timed out");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -276,11 +277,11 @@ int Driver::_wait_for_cmd_allowed()
|
|||||||
* "Auto Command 12", waiting only for "Command Inhibit" isn't sufficient
|
* "Auto Command 12", waiting only for "Command Inhibit" isn't sufficient
|
||||||
* as "Data Line Active" and "Data Inhibit" may also be active.
|
* as "Data Line Active" and "Data Inhibit" may also be active.
|
||||||
*/
|
*/
|
||||||
if (!wait_for<Prsstat::Dla>(0, _delayer) ||
|
try { wait_for(_delayer, Prsstat::Dla::Equal(0),
|
||||||
!wait_for<Prsstat::Sdstb>(1, _delayer) ||
|
Prsstat::Sdstb::Equal(1),
|
||||||
!wait_for<Prsstat::Cihb>(0, _delayer) ||
|
Prsstat::Cihb::Equal(0),
|
||||||
!wait_for<Prsstat::Cdihb>(0, _delayer))
|
Prsstat::Cdihb::Equal(0)); }
|
||||||
{
|
catch (Polling_timeout) {
|
||||||
error("wait till issuing a new command is allowed timed out");
|
error("wait till issuing a new command is allowed timed out");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -295,7 +296,8 @@ Card_info Driver::_init()
|
|||||||
_irq.ack_irq();
|
_irq.ack_irq();
|
||||||
|
|
||||||
/* configure host for initialization stage */
|
/* configure host for initialization stage */
|
||||||
if (_reset(_delayer)) { _detect_err("Host reset failed"); }
|
if (_reset()) {
|
||||||
|
_detect_err("Host reset failed"); }
|
||||||
_disable_irqs();
|
_disable_irqs();
|
||||||
|
|
||||||
if (!_supported_host_version(Mmio::read<Hostver>())) {
|
if (!_supported_host_version(Mmio::read<Hostver>())) {
|
||||||
@ -429,14 +431,15 @@ void Driver::_detect_err(char const * const err)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int Driver::_reset(Delayer &delayer)
|
int Driver::_reset()
|
||||||
{
|
{
|
||||||
/* start reset */
|
/* start reset */
|
||||||
Mmio::write<Sysctl::Rsta>(1);
|
Mmio::write<Sysctl::Rsta>(1);
|
||||||
_reset_amendments();
|
_reset_amendments();
|
||||||
|
|
||||||
/* wait for reset completion */
|
/* wait for reset completion */
|
||||||
if (!wait_for<Sysctl::Rsta>(0, delayer)) {
|
try { wait_for(_delayer, Sysctl::Rsta::Equal(0)); }
|
||||||
|
catch (Polling_timeout) {
|
||||||
error("Reset timed out");
|
error("Reset timed out");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -521,7 +524,7 @@ void Driver::_enable_clock(Clock_divider divider)
|
|||||||
|
|
||||||
void Driver::_clock(Clock clock)
|
void Driver::_clock(Clock clock)
|
||||||
{
|
{
|
||||||
wait_for<Prsstat::Sdstb>(1, _delayer);
|
wait_for(_delayer, Prsstat::Sdstb::Equal(1));
|
||||||
_disable_clock();
|
_disable_clock();
|
||||||
_clock_finish(clock);
|
_clock_finish(clock);
|
||||||
}
|
}
|
||||||
|
@ -234,7 +234,7 @@ class Sd_card::Driver : public Driver_base,
|
|||||||
void _enable_clock_finish();
|
void _enable_clock_finish();
|
||||||
void _clock(Clock clock);
|
void _clock(Clock clock);
|
||||||
void _clock_finish(Clock clock);
|
void _clock_finish(Clock clock);
|
||||||
int _reset(Delayer & delayer);
|
int _reset();
|
||||||
void _reset_amendments();
|
void _reset_amendments();
|
||||||
int _wait_for_cmd_allowed();
|
int _wait_for_cmd_allowed();
|
||||||
int _wait_for_cmd_complete();
|
int _wait_for_cmd_complete();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user