On Wed, 4 Sep 2019 at 13:56, Damien Hedde <damien.he...@greensocs.com> wrote: > > Switch the cadence uart to multi-phase reset and add the > reference clock input. > > The input clock frequency is added to the migration structure. > > The reference clock controls the baudrate generation. If it disabled, > any input characters and events are ignored. > > If this clock remains unconnected, the uart behaves as before > (it default to a 50MHz ref clock). > > Signed-off-by: Damien Hedde <damien.he...@greensocs.com>
> static void uart_parameters_setup(CadenceUARTState *s) > { > QEMUSerialSetParams ssp; > - unsigned int baud_rate, packet_size; > + unsigned int baud_rate, packet_size, input_clk; > + input_clk = clock_get_frequency(s->refclk); > > - baud_rate = (s->r[R_MR] & UART_MR_CLKS) ? > - UART_INPUT_CLK / 8 : UART_INPUT_CLK; > + baud_rate = (s->r[R_MR] & UART_MR_CLKS) ? input_clk / 8 : input_clk; > + baud_rate /= (s->r[R_BRGR] * (s->r[R_BDIV] + 1)); > + trace_cadence_uart_baudrate(baud_rate); > + > + ssp.speed = baud_rate; > > - ssp.speed = baud_rate / (s->r[R_BRGR] * (s->r[R_BDIV] + 1)); > packet_size = 1; > > switch (s->r[R_MR] & UART_MR_PAR) { > @@ -215,6 +220,13 @@ static void uart_parameters_setup(CadenceUARTState *s) > } > > packet_size += ssp.data_bits + ssp.stop_bits; > + if (ssp.speed == 0) { > + /* > + * Avoid division-by-zero below. > + * TODO: find something better > + */ Any ideas what might be better? :-) > + ssp.speed = 1; > + } > s->char_tx_time = (NANOSECONDS_PER_SECOND / ssp.speed) * packet_size; > qemu_chr_fe_ioctl(&s->chr, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp); > } thanks -- PMM