[PATCH 2/2] serial_ns16550: use 'struct device_d *' instead of 'struct console_device *'
Antony Pavlov
antonynpavlov at gmail.com
Thu Aug 4 00:54:43 EDT 2011
On 4 August 2011 04:37, Jean-Christophe PLAGNIOL-VILLARD
<plagnioj at jcrosoft.com> wrote:
> On 22:37 Wed 03 Aug , Antony Pavlov wrote:
>> ns16550_read() and ns16550_write() functions are private functions
>> of the driver so there is no need to pass them 'struct console_device *'
>> pointer to get private device data.
>>
>> Signed-off-by: Antony Pavlov <antonynpavlov at gmail.com>
>> ---
> Does not simplify the code
>
> does not see the need
Just the opposite!
Without this patch we do the operation 'dev = cdev->dev' at _EVERY
SINGLE CALL_ of ns16550_read/ns16550_write.
In the driver, only in ns16550_tstc() we have single call of
ns16550_read(). In all other places we have multiple
ns16550_read/ns16550_write. So we can move 'dev = cdev->dev'
to caller without any damage.
Moreover, in ns16550_putc() we have cycle:
----
while ((ns16550_read(dev, lsr) & LSR_THRE) == 0) ;
----
On every cycle loop we do 'dev = cdev->dev' !
Disassemble the compiled barebox and you will see that you have many
memory memory accesses at the entrance to the
ns16550_read/ns16550_write functions.
So, removing this 'dev = cdev->dev' we remove one memory access.
This is a real optimization!
Also, confirmation of this patch comes from simple logic.
Simple question.
Have we need of 'console_device *cdev' pointer in
ns16550_read/ns16550_write at all?
My answer is 'No'.
Console_device is very high-level abstraction structure, but
ns16550_read/ns16550_write functions work at the low-level.
They work with the private driver data, but cdev can't directly supply
this private data.
--
Best regards,
Antony Pavlov
More information about the barebox
mailing list