Проблема возникает с устройством UART, в котором задействованы два драйвера:
Драйвер 1: драйвер шины AMBA (
Код: Выделить всё
drivers/amba/bus.c
Код: Выделить всё
drivers/tty/serial/amba-pl011.c
Вот последовательность событий:
- Драйвер 1 (драйвер шины AMBA) подключает UART устройство для чтения идентификатора периферийного устройства. Это запускает GenPD для включения устройства (. Выключение устройства откладывается, и статус GENPD_STATE_OFF не устанавливается сразу. Отсоединение происходит в строке 203.
Код: Выделить всё
genpd->status = GENPD_STATE_ON). Подключение происходит в строке 141 драйвера шины AMBA. [*]Затем драйвер 1 отключает устройство, планируя операцию выключения с помощью genpd_queue_power_off_work(pd);
- Прежде чем произойдет отложенное отключение питания, Драйвер 2 (драйвер UART PL011) подключается к устройству UART. GenPD обнаруживает, что для genpd->status установлено значение GENPD_STATE_ON, предполагая, что устройство включено, и поэтому не включает его снова.
- В конце концов, отложенное питание -off выполняется, устанавливается genpd->status = GENPD_STATE_OFF, и устройство выключается.
Вопрос:
Что такое лучший способ решить эту проблему: либо путем внесения изменений в драйвер genPD, либо путем внесения изменений в драйвер шины AMBA и драйвер UART PL011? Я ищу решения, которые гарантируют, что состояние домена питания точно отражает текущее и предполагаемое состояние устройства, даже когда задействованы операции отложенного отключения питания.
У меня есть следующие соображения:
- Введение переходного состояния (например, GENPD_STATE_POWERING_OFF) в драйвере genPD и возврат ошибки UART-драйверу, когда UART-драйвер пытается подключиться и позвольте UART-драйверу вернуть -EPROBE_DEFER ядру, чтобы у ядра была возможность вернуться и проверить еще раз.
Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/788 ... enpd-linux