usb: chipidea: add system interface for ttctrl.ttha
authorPeter Chen <peter.chen@nxp.com>
Mon, 1 Feb 2016 06:23:44 +0000 (14:23 +0800)
committerPeter Chen <peter.chen@nxp.com>
Mon, 29 Feb 2016 05:37:51 +0000 (13:37 +0800)
In chipidea IP RTL, there is a very limited design for siTD, the detail
like below:
There is no Max Packet Size at siTD, so it uses one constant for both
Max Packet Size for packet and the packet size for the last transaction
when considering schedule.
If the ttctrl.ttha does not match against Hub Address field in siTD,
this constant is 188 bytes, else this constant is 1023 bytes.

If the ttctrl.ttha is non-zero value, RTL will use 188 as this constant,
so it will lose the data if the packet size is larger than 188 bytes, eg,
if we playback a wav which format is 48khz, 16 bits, 2 channels, the
packet size will be 192bytes, but the controller will only send 188 bytes
for this packet, the noise will be heared using USB audio card.
The use case is single transaction, but higher frame rate.

If the ttctr.ttha is zero value, we can send 1023 bytes within one
transaction, but the controller will not accept the coming tranaction
if it considers the schedule time is less than 1023 bytes. So the
limitation is we can't schedule as many as transactions within frame.
If the total bytes is already 256 bytes for previous transactions within
frame, it can't accept another transaction. The use case is multiple
transactions, but less frame rate.

Signed-off-by: Peter Chen <peter.chen@nxp.com>
drivers/usb/chipidea/core.c

index 7404064b9bbcb26016eacf33fdfbb1e6626ba09b..69426e644d17019b1c6e2d672b2e1a04cbffc3fd 100644 (file)
@@ -721,6 +721,9 @@ static int ci_get_platdata(struct device *dev,
                return ret;
        }
 
+       if (of_find_property(dev->of_node, "non-zero-ttctrl-ttha", NULL))
+               platdata->flags |= CI_HDRC_SET_NON_ZERO_TTHA;
+
        ext_id = ERR_PTR(-ENODEV);
        ext_vbus = ERR_PTR(-ENODEV);
        if (of_property_read_bool(dev->of_node, "extcon")) {