@@ -133,16 +133,22 @@ static void pl011_disable_fifo(const struct device *dev)
133133
134134static void pl011_set_flow_control (const struct device * dev , bool rts , bool cts )
135135{
136+ volatile struct pl011_regs * uart = get_uart (dev );
137+ uint32_t cr = uart -> cr ;
138+
136139if (rts ) {
137- get_uart ( dev ) -> cr |= PL011_CR_RTSEn ;
140+ cr |= PL011_CR_RTSEn ;
138141} else {
139- get_uart ( dev ) -> cr &= ~PL011_CR_RTSEn ;
142+ cr &= ~PL011_CR_RTSEn ;
140143}
144+
141145if (cts ) {
142- get_uart ( dev ) -> cr |= PL011_CR_CTSEn ;
146+ cr |= PL011_CR_CTSEn ;
143147} else {
144- get_uart ( dev ) -> cr &= ~PL011_CR_CTSEn ;
148+ cr &= ~PL011_CR_CTSEn ;
145149}
150+
151+ uart -> cr = cr ;
146152}
147153
148154static int pl011_set_baudrate (const struct device * dev ,
@@ -151,6 +157,7 @@ static int pl011_set_baudrate(const struct device *dev,
151157/* Avoiding float calculations, bauddiv is left shifted by 6 */
152158uint64_t bauddiv = (((uint64_t )clk ) << PL011_FBRD_WIDTH )
153159/ (baudrate * 16U );
160+ volatile struct pl011_regs * uart = get_uart (dev );
154161
155162/* Valid bauddiv value
156163 * uart_clk (min) >= 16 x baud_rate (max)
@@ -161,73 +168,80 @@ static int pl011_set_baudrate(const struct device *dev,
161168return - EINVAL ;
162169}
163170
164- get_uart ( dev ) -> ibrd = bauddiv >> PL011_FBRD_WIDTH ;
165- get_uart ( dev ) -> fbrd = bauddiv & ((1u << PL011_FBRD_WIDTH ) - 1u );
171+ uart -> ibrd = bauddiv >> PL011_FBRD_WIDTH ;
172+ uart -> fbrd = bauddiv & ((1u << PL011_FBRD_WIDTH ) - 1u );
166173
167174barrier_dmem_fence_full ();
168175
169176/* In order to internally update the contents of ibrd or fbrd, a
170177 * lcr_h write must always be performed at the end
171178 * ARM DDI 0183F, Pg 3-13
172179 */
173- get_uart ( dev ) -> lcr_h = get_uart ( dev ) -> lcr_h ;
180+ uart -> lcr_h = uart -> lcr_h ;
174181
175182return 0 ;
176183}
177184
178185static bool pl011_is_readable (const struct device * dev )
179186{
180187struct pl011_data * data = dev -> data ;
188+ volatile struct pl011_regs * uart = get_uart (dev );
189+ uint32_t cr = uart -> cr ;
181190
182191if (!data -> sbsa &&
183- (!(get_uart ( dev ) -> cr & PL011_CR_UARTEN ) || !(get_uart ( dev ) -> cr & PL011_CR_RXE ))) {
192+ (!(cr & PL011_CR_UARTEN ) || !(cr & PL011_CR_RXE ))) {
184193return false;
185194}
186195
187- return (get_uart ( dev ) -> fr & PL011_FR_RXFE ) == 0U ;
196+ return (uart -> fr & PL011_FR_RXFE ) == 0U ;
188197}
189198
190199static int pl011_poll_in (const struct device * dev , unsigned char * c )
191200{
201+ volatile struct pl011_regs * uart = get_uart (dev );
202+
192203if (!pl011_is_readable (dev )) {
193204return -1 ;
194205}
195206
196207/* got a character */
197- * c = (unsigned char )get_uart ( dev ) -> dr ;
208+ * c = (unsigned char )uart -> dr ;
198209
199- return get_uart ( dev ) -> rsr & PL011_RSR_ERROR_MASK ;
210+ return uart -> rsr & PL011_RSR_ERROR_MASK ;
200211}
201212
202213static void pl011_poll_out (const struct device * dev ,
203214 unsigned char c )
204215{
216+ volatile struct pl011_regs * uart = get_uart (dev );
217+
205218/* Wait for space in FIFO */
206- while (get_uart ( dev ) -> fr & PL011_FR_TXFF ) {
219+ while (uart -> fr & PL011_FR_TXFF ) {
207220; /* Wait */
208221}
209222
210223/* Send a character */
211- get_uart ( dev ) -> dr = (uint32_t )c ;
224+ uart -> dr = (uint32_t )c ;
212225}
213226
214227static int pl011_err_check (const struct device * dev )
215228{
229+ uint32_t rsr = get_uart (dev )-> rsr ;
216230int errors = 0 ;
217231
218- if (get_uart ( dev ) -> rsr & PL011_RSR_ECR_OE ) {
232+ if (rsr & PL011_RSR_ECR_OE ) {
219233errors |= UART_ERROR_OVERRUN ;
220234}
221235
222- if (get_uart ( dev ) -> rsr & PL011_RSR_ECR_BE ) {
236+ if (rsr & PL011_RSR_ECR_BE ) {
223237errors |= UART_BREAK ;
224238}
225239
226- if (get_uart ( dev ) -> rsr & PL011_RSR_ECR_PE ) {
240+ if (rsr & PL011_RSR_ECR_PE ) {
227241errors |= UART_ERROR_PARITY ;
228242}
229243
230- if (get_uart ( dev ) -> rsr & PL011_RSR_ECR_FE ) {
244+ if (rsr & PL011_RSR_ECR_FE ) {
231245errors |= UART_ERROR_FRAMING ;
232246}
233247
@@ -240,6 +254,7 @@ static int pl011_runtime_configure_internal(const struct device *dev,
240254{
241255const struct pl011_config * config = dev -> config ;
242256struct pl011_data * data = dev -> data ;
257+ volatile struct pl011_regs * uart = get_uart (dev );
243258uint32_t lcrh ;
244259int ret = - ENOTSUP ;
245260
@@ -252,7 +267,7 @@ static int pl011_runtime_configure_internal(const struct device *dev,
252267pl011_disable_fifo (dev );
253268}
254269
255- lcrh = get_uart ( dev ) -> lcr_h & ~(PL011_LCRH_FORMAT_MASK | PL011_LCRH_STP2 );
270+ lcrh = uart -> lcr_h & ~(PL011_LCRH_FORMAT_MASK | PL011_LCRH_STP2 );
256271
257272switch (cfg -> parity ) {
258273case UART_CFG_PARITY_NONE :
@@ -314,7 +329,7 @@ static int pl011_runtime_configure_internal(const struct device *dev,
314329}
315330
316331/* Update settings */
317- get_uart ( dev ) -> lcr_h = lcrh ;
332+ uart -> lcr_h = lcrh ;
318333
319334memcpy (& data -> uart_cfg , cfg , sizeof (data -> uart_cfg ));
320335
@@ -353,21 +368,23 @@ static int pl011_runtime_config_get(const struct device *dev,
353368static int pl011_fifo_fill (const struct device * dev ,
354369 const uint8_t * tx_data , int len )
355370{
371+ volatile struct pl011_regs * uart = get_uart (dev );
356372int num_tx = 0U ;
357373
358- while (!(get_uart ( dev ) -> fr & PL011_FR_TXFF ) && (len - num_tx > 0 )) {
359- get_uart ( dev ) -> dr = tx_data [num_tx ++ ];
374+ while (!(uart -> fr & PL011_FR_TXFF ) && (len - num_tx > 0 )) {
375+ uart -> dr = tx_data [num_tx ++ ];
360376}
361377return num_tx ;
362378}
363379
364380static int pl011_fifo_read (const struct device * dev ,
365381 uint8_t * rx_data , const int len )
366382{
383+ volatile struct pl011_regs * uart = get_uart (dev );
367384int num_rx = 0U ;
368385
369- while ((len - num_rx > 0 ) && !(get_uart ( dev ) -> fr & PL011_FR_RXFE )) {
370- rx_data [num_rx ++ ] = get_uart ( dev ) -> dr ;
386+ while ((len - num_rx > 0 ) && !(uart -> fr & PL011_FR_RXFE )) {
387+ rx_data [num_rx ++ ] = uart -> dr ;
371388}
372389
373390return num_rx ;
@@ -376,8 +393,9 @@ static int pl011_fifo_read(const struct device *dev,
376393static void pl011_irq_tx_enable (const struct device * dev )
377394{
378395struct pl011_data * data = dev -> data ;
396+ volatile struct pl011_regs * uart = get_uart (dev );
379397
380- get_uart ( dev ) -> imsc |= PL011_IMSC_TXIM ;
398+ uart -> imsc |= PL011_IMSC_TXIM ;
381399if (!data -> sw_call_txdrdy ) {
382400return ;
383401}
@@ -405,7 +423,7 @@ static void pl011_irq_tx_enable(const struct device *dev)
405423 * FIFO threshold may never be reached, and the hardware TX interrupt
406424 * will never trigger.
407425 */
408- while (get_uart ( dev ) -> imsc & PL011_IMSC_TXIM ) {
426+ while (uart -> imsc & PL011_IMSC_TXIM ) {
409427K_SPINLOCK (& data -> irq_cb_lock ) {
410428data -> irq_cb (dev , data -> irq_cb_data );
411429}
@@ -429,14 +447,15 @@ static int pl011_irq_tx_complete(const struct device *dev)
429447static int pl011_irq_tx_ready (const struct device * dev )
430448{
431449struct pl011_data * data = dev -> data ;
450+ volatile struct pl011_regs * uart = get_uart (dev );
432451
433- if (!data -> sbsa && !(get_uart ( dev ) -> cr & PL011_CR_TXE )) {
452+ if (!data -> sbsa && !(uart -> cr & PL011_CR_TXE )) {
434453return false;
435454}
436455
437- return ((get_uart ( dev ) -> imsc & PL011_IMSC_TXIM ) &&
456+ return ((uart -> imsc & PL011_IMSC_TXIM ) &&
438457/* Check for TX interrupt status is set or TX FIFO is empty. */
439- (get_uart ( dev ) -> ris & PL011_RIS_TXRIS || get_uart ( dev ) -> fr & PL011_FR_TXFE ));
458+ (uart -> ris & PL011_RIS_TXRIS || uart -> fr & PL011_FR_TXFE ));
440459}
441460
442461static void pl011_irq_rx_enable (const struct device * dev )
@@ -451,14 +470,15 @@ static void pl011_irq_rx_disable(const struct device *dev)
451470
452471static int pl011_irq_rx_ready (const struct device * dev )
453472{
473+ volatile struct pl011_regs * uart = get_uart (dev );
454474struct pl011_data * data = dev -> data ;
455475
456- if (!data -> sbsa && !(get_uart ( dev ) -> cr & PL011_CR_RXE )) {
476+ if (!data -> sbsa && !(uart -> cr & PL011_CR_RXE )) {
457477return false;
458478}
459479
460- return ((get_uart ( dev ) -> imsc & PL011_IMSC_RXIM ) &&
461- (!(get_uart ( dev ) -> fr & PL011_FR_RXFE )));
480+ return ((uart -> imsc & PL011_IMSC_RXIM ) &&
481+ (!(uart -> fr & PL011_FR_RXFE )));
462482}
463483
464484static void pl011_irq_err_enable (const struct device * dev )
@@ -523,10 +543,14 @@ static int pl011_init(const struct device *dev)
523543{
524544const struct pl011_config * config = dev -> config ;
525545struct pl011_data * data = dev -> data ;
546+ volatile struct pl011_regs * uart ;
526547int ret ;
527548
528549DEVICE_MMIO_MAP (dev , K_MEM_CACHE_NONE );
529550
551+ /* Must be placed after DEVICE_MMIO_MAP */
552+ uart = get_uart (dev );
553+
530554#if defined(CONFIG_RESET )
531555if (config -> reset .dev ) {
532556ret = reset_line_toggle_dt (& config -> reset );
@@ -575,7 +599,7 @@ static int pl011_init(const struct device *dev)
575599pl011_runtime_configure_internal (dev , & data -> uart_cfg , false);
576600
577601/* Setting transmit and receive interrupt FIFO level */
578- get_uart ( dev ) -> ifls = FIELD_PREP (PL011_IFLS_TXIFLSEL_M , TXIFLSEL_1_8_FULL )
602+ uart -> ifls = FIELD_PREP (PL011_IFLS_TXIFLSEL_M , TXIFLSEL_1_8_FULL )
579603| FIELD_PREP (PL011_IFLS_RXIFLSEL_M , RXIFLSEL_1_2_FULL );
580604
581605/* Enabling the FIFOs */
@@ -584,14 +608,14 @@ static int pl011_init(const struct device *dev)
584608}
585609}
586610/* initialize all IRQs as masked */
587- get_uart ( dev ) -> imsc = 0U ;
588- get_uart ( dev ) -> icr = PL011_IMSC_MASK_ALL ;
611+ uart -> imsc = 0U ;
612+ uart -> icr = PL011_IMSC_MASK_ALL ;
589613
590614if (!data -> sbsa ) {
591- get_uart ( dev ) -> dmacr = 0U ;
615+ uart -> dmacr = 0U ;
592616barrier_isync_fence_full ();
593- get_uart ( dev ) -> cr &= ~PL011_CR_SIREN ;
594- get_uart ( dev ) -> cr |= PL011_CR_RXE | PL011_CR_TXE ;
617+ uart -> cr &= ~PL011_CR_SIREN ;
618+ uart -> cr |= PL011_CR_RXE | PL011_CR_TXE ;
595619barrier_isync_fence_full ();
596620}
597621#ifdef CONFIG_UART_INTERRUPT_DRIVEN
0 commit comments