Skip to content

Commit

Permalink
[ALPS07777697] USB Offload: modify mode determination
Browse files Browse the repository at this point in the history
When kernel enters suspend mode, we should reply the current mode
to mtu3 drivers. If one of the low-power-related structure falls
to reserved dram, even its in advanced mode, APSRC request
should not be released.

Add a list to store the buffer which indicating structure that
fell into reserved dram and check if its empty when mtu3 is
requesting for current mode.

MTK-Commit-Id: 87c2807e30cedc05279647aae3e91cb5ae3b0540

Signed-off-by: Jason Liu <[email protected]>
CR-Id: ALPS07777697
Feature: USB type C audio offload
Change-Id: Ia161deeac74a334205d038f4f833d4338e84858e
  • Loading branch information
Jason Liu authored and JeremyChou-MTK committed Apr 15, 2023
1 parent 9f1c394 commit 86015b6
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 21 deletions.
3 changes: 2 additions & 1 deletion drivers/misc/mediatek/usb/usb_offload/usb_offload.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ struct usb_offload_buffer {
bool is_sram;
bool is_rsv;
u8 type;
struct list_head list;
};

enum usb_offload_mem_id {
Expand Down Expand Up @@ -270,7 +271,7 @@ extern int mtk_usb_offload_deinit_rsv_sram(void);
extern int mtk_offload_alloc_mem(struct usb_offload_buffer *buf, unsigned int size,
int align, enum usb_offload_mem_id mem_id, bool is_rsv);
extern int mtk_offload_free_mem(struct usb_offload_buffer *buf);
extern bool mtk_offload_is_sram_mode(void);
extern bool mtk_offload_is_advlowpwr(struct usb_offload_dev *udev);
extern int mtk_offload_get_rsv_mem_info(enum usb_offload_mem_id mem_id,
unsigned int *phys, unsigned int *size);
extern bool is_sram(enum usb_offload_mem_id id);
Expand Down
13 changes: 8 additions & 5 deletions drivers/misc/mediatek/usb/usb_offload/usb_offload_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -2354,16 +2354,19 @@ static struct xhci_vendor_ops xhci_mtk_vendor_ops = {

int xhci_mtk_ssusb_offload_get_mode(struct device *dev)
{
bool is_sram_mode;
bool is_in_advanced;

is_sram_mode = mtk_offload_is_sram_mode();
USB_OFFLOAD_INFO("is_streaming:%d, is_sram_mode:%d\n",
uodev->is_streaming, is_sram_mode);
is_in_advanced = mtk_offload_is_advlowpwr(uodev);
USB_OFFLOAD_INFO("is_streaming:%d, is_in_advanced:%d\n",
uodev->is_streaming, is_in_advanced);

if (!uodev->is_streaming)
return SSUSB_OFFLOAD_MODE_NONE;

return is_sram_mode ? SSUSB_OFFLOAD_MODE_S : SSUSB_OFFLOAD_MODE_D;
/* we only release APSRC request in advanced mode by
* notifying SSUSB_OFFLOAD_MODE_S to mtu3 driver
*/
return is_in_advanced ? SSUSB_OFFLOAD_MODE_S : SSUSB_OFFLOAD_MODE_D;
}

static int usb_offload_probe(struct platform_device *pdev)
Expand Down
58 changes: 43 additions & 15 deletions drivers/misc/mediatek/usb/usb_offload/usb_offload_mem.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,38 @@ static struct mtk_sram_pwr sram_pwr[MEM_TYPE_NUM];

struct usb_offload_mem_info usb_offload_mem_buffer[USB_OFFLOAD_MEM_NUM];

/* a list to store buffer which downgrade from sram to dram */
LIST_HEAD(downgrade_list);

static bool is_buf_downgrade(struct usb_offload_buffer *buf)
{
struct usb_offload_buffer *pos;
bool found = false;

list_for_each_entry(pos, &downgrade_list, list) {
if (pos == buf) {
found = true;
break;
}
}

return found;
}

bool mtk_offload_is_advlowpwr(struct usb_offload_dev *udev)
{
/* if adv_lowpwr is false, it means that either sram feature is
* disabled in dts or basic sram is not supported in this platform.
*/
if (!udev->adv_lowpwr)
return false;

/* if list is empty, it means no structure falls to dram,
* so it's in advanced mode, in an other hands, it's basic
*/
return list_empty(&downgrade_list);
}
EXPORT_SYMBOL_GPL(mtk_offload_is_advlowpwr);

static void reset_buffer(struct usb_offload_buffer *buf)
{
Expand Down Expand Up @@ -103,20 +134,6 @@ int mtk_offload_get_rsv_mem_info(enum usb_offload_mem_id mem_id,
}
EXPORT_SYMBOL_GPL(mtk_offload_get_rsv_mem_info);

bool mtk_offload_is_sram_mode(void)
{
#ifdef MTK_AUDIO_INTERFACE_READY
u32 i;

for (i = 0; i < MEM_TYPE_NUM; i++) {
if (atomic_read(&sram_pwr[i].cnt))
return true;
}
#endif
return false;
}
EXPORT_SYMBOL_GPL(mtk_offload_is_sram_mode);

bool is_sram(enum usb_offload_mem_id id)
{
return id == USB_OFFLOAD_MEM_SRAM_ID ? true : false;
Expand Down Expand Up @@ -531,6 +548,12 @@ int mtk_offload_alloc_mem(struct usb_offload_buffer *buf,
goto ALLOC_FAIL;

ALLOC_SUCCESS:
if (is_sram(mem_id) && !buf->is_sram) {
/* we requeset for sram, but turn out to be dram */
USB_OFFLOAD_INFO("buf:%p falls from sram to dram\n", buf);
list_add_tail(&buf->list, &downgrade_list);
}

USB_OFFLOAD_INFO("va:%p phy:0x%llx size:%zu is_sram:%d is_rsv:%d type:%s\n",
buf->dma_area, (unsigned long long)buf->dma_addr,
buf->dma_bytes, buf->is_sram, buf->is_rsv,
Expand Down Expand Up @@ -565,8 +588,13 @@ int mtk_offload_free_mem(struct usb_offload_buffer *buf)
type = buf->type;
is_sram = buf->is_sram;

if (!buf->is_sram)
if (!buf->is_sram) {
ret = mtk_usb_offload_free_rsv_mem(buf, USB_OFFLOAD_MEM_DRAM_ID);

if (is_buf_downgrade(buf))
list_del(&buf->list);

}
else if (uodev->adv_lowpwr) {
if (buf->is_rsv)
ret = mtk_usb_offload_free_rsv_mem(buf, USB_OFFLOAD_MEM_SRAM_ID);
Expand Down

0 comments on commit 86015b6

Please sign in to comment.