Skip to content

Commit 3ce2426

Browse files
jiegan0107shashim-quic
authored andcommitted
QCLINUX: qcom-dcc: add logic to configure linked list in probe
Configure the linked list with defined register entries in dcc_probe. Signed-off-by: Jie Gan <jie.gan@oss.qualcomm.com>
1 parent 3a635a8 commit 3ce2426

3 files changed

Lines changed: 121 additions & 0 deletions

File tree

drivers/misc/qcom-dcc-dev.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,50 @@
1212

1313
static struct platform_device *dcc_pdev;
1414

15+
static const struct dcc_register_entry talos_dcc_entries[] = {
16+
{ "R 0x3d96000" },
17+
{ "R 0x3d96004" },
18+
};
19+
20+
static const struct dcc_link_config talos_link_configs[] = {
21+
{
22+
.link_list = 3,
23+
.entries = talos_dcc_entries,
24+
.num_entries = ARRAY_SIZE(talos_dcc_entries),
25+
},
26+
};
27+
28+
static const struct dcc_config talos_config = {
29+
.lists = talos_link_configs,
30+
.num_lists = ARRAY_SIZE(talos_link_configs),
31+
};
32+
1533
static const struct dcc_pdata talos_pdata = {
1634
.base = 0x010a2000,
1735
.size = 0x00001000,
1836
.ram_base = 0x010ae000,
1937
.ram_size = 0x00002000,
2038
.dcc_offset = 0x6000,
2139
.map_ver = 0x1,
40+
.config = &talos_config,
41+
};
42+
43+
static const struct dcc_register_entry lemans_dcc_entries[] = {
44+
{ "R 0x610110 1" },
45+
{ "R 0x9050008 1" },
46+
};
47+
48+
static const struct dcc_link_config lemans_link_configs[] = {
49+
{
50+
.link_list = 6,
51+
.entries = lemans_dcc_entries,
52+
.num_entries = ARRAY_SIZE(lemans_dcc_entries),
53+
},
54+
};
55+
56+
static const struct dcc_config lemans_config = {
57+
.lists = lemans_link_configs,
58+
.num_lists = ARRAY_SIZE(lemans_link_configs),
2259
};
2360

2461
static const struct dcc_pdata lemans_pdata = {
@@ -28,6 +65,7 @@ static const struct dcc_pdata lemans_pdata = {
2865
.ram_size = 0x00006000,
2966
.dcc_offset = 0x38800,
3067
.map_ver = 0x3,
68+
.config = &lemans_config,
3169
};
3270

3371
static const struct dcc_pdata kodiak_pdata = {

drivers/misc/qcom-dcc.c

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1425,6 +1425,72 @@ static ssize_t dcc_sram_read(struct file *file, char __user *data,
14251425
return len;
14261426
}
14271427

1428+
static void dcc_configure_list(struct dcc_drvdata *drvdata,
1429+
const struct dcc_config *config)
1430+
{
1431+
const struct dcc_link_config *link;
1432+
const struct dcc_register_entry *entry;
1433+
char *token, *bufp, *buf_orig;
1434+
char *delim = " ";
1435+
int ret, i, j, configured;
1436+
size_t len;
1437+
1438+
if (!config || !config->num_lists)
1439+
return;
1440+
1441+
for (i = 0; i < config->num_lists; i++) {
1442+
link = &config->lists[i];
1443+
1444+
if (link->link_list >= drvdata->max_link_list) {
1445+
dev_err(drvdata->dev, "Invalid link list index %d\n", link->link_list);
1446+
continue;
1447+
}
1448+
1449+
configured = 0;
1450+
1451+
for (j = 0; j < link->num_entries; j++) {
1452+
entry = &link->entries[j];
1453+
1454+
len = strlen(entry->config);
1455+
buf_orig = kzalloc(len + 1, GFP_KERNEL);
1456+
if (!buf_orig)
1457+
return;
1458+
1459+
strscpy(buf_orig, entry->config, len + 1);
1460+
bufp = buf_orig;
1461+
1462+
token = strsep(&bufp, delim);
1463+
if (!bufp) {
1464+
dev_err(drvdata->dev, "Malformed entry: \"%s\"\n",
1465+
entry->config);
1466+
kfree(buf_orig);
1467+
continue;
1468+
}
1469+
1470+
if (!strcmp("R", token)) {
1471+
ret = dcc_config_add_read(drvdata, bufp, link->link_list);
1472+
} else if (!strcmp("W", token)) {
1473+
ret = dcc_config_add_write(drvdata, bufp, link->link_list);
1474+
} else if (!strcmp("RW", token)) {
1475+
ret = dcc_config_add_read_write(drvdata, bufp, link->link_list);
1476+
} else if (!strcmp("L", token)) {
1477+
ret = dcc_config_add_loop(drvdata, bufp, link->link_list);
1478+
} else {
1479+
dev_err(drvdata->dev, "%s is not a correct input\n", token);
1480+
ret = -EINVAL;
1481+
}
1482+
1483+
if (ret >= 0)
1484+
configured++;
1485+
1486+
kfree(buf_orig);
1487+
}
1488+
1489+
if (configured)
1490+
dcc_enable(drvdata, link->link_list);
1491+
}
1492+
}
1493+
14281494
static const struct file_operations dcc_sram_fops = {
14291495
.owner = THIS_MODULE,
14301496
.read = dcc_sram_read,
@@ -1520,6 +1586,7 @@ static int dcc_probe(struct platform_device *pdev)
15201586
}
15211587

15221588
dcc_create_debug_dir(drvdata);
1589+
dcc_configure_list(drvdata, pdata->config);
15231590

15241591
return 0;
15251592
}

drivers/misc/qcom-dcc.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,29 @@
88

99
#include <linux/platform_device.h>
1010

11+
struct dcc_register_entry {
12+
const char *config;
13+
};
14+
15+
struct dcc_link_config {
16+
int link_list;
17+
const struct dcc_register_entry *entries;
18+
int num_entries;
19+
};
20+
21+
struct dcc_config {
22+
const struct dcc_link_config *lists;
23+
int num_lists;
24+
};
25+
1126
struct dcc_pdata {
1227
phys_addr_t base;
1328
resource_size_t size;
1429
phys_addr_t ram_base;
1530
resource_size_t ram_size;
1631
u32 dcc_offset;
1732
u8 map_ver;
33+
const struct dcc_config *config;
1834
};
1935

2036
#endif

0 commit comments

Comments
 (0)