Commit 30d8bb90 authored by Arnd Bergmann's avatar Arnd Bergmann

Merge tag 'omap-for-v5.4/ti-sysc-part2-signed' of...

Merge tag 'omap-for-v5.4/ti-sysc-part2-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into arm/late

more ti-sysc driver changes for omap variants for v5.4

Few changes mostly to deal with sgx SoC glue quirk for omap36xx that
is needed for the related sgx SoC glue dts branch. The other changes
are to simplify sysc_check_one_child() sysc_check_children() to be void
functions, and detect d2d module when debugging is enabled.

* tag 'omap-for-v5.4/ti-sysc-part2-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap:
  bus: ti-sysc: Detect d2d when debug is enabled
  bus: ti-sysc: Add module enable quirk for SGX on omap36xx
  bus: ti-sysc: Change return types of functions

Link: https://lore.kernel.org/r/pull-1567016893-318461@atomide.com-2Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parents bf3176b3 7edd00f7
...@@ -73,6 +73,7 @@ static const char * const clock_names[SYSC_MAX_CLOCKS] = { ...@@ -73,6 +73,7 @@ static const char * const clock_names[SYSC_MAX_CLOCKS] = {
* @clk_enable_quirk: module specific clock enable quirk * @clk_enable_quirk: module specific clock enable quirk
* @clk_disable_quirk: module specific clock disable quirk * @clk_disable_quirk: module specific clock disable quirk
* @reset_done_quirk: module specific reset done quirk * @reset_done_quirk: module specific reset done quirk
* @module_enable_quirk: module specific enable quirk
*/ */
struct sysc { struct sysc {
struct device *dev; struct device *dev;
...@@ -98,6 +99,7 @@ struct sysc { ...@@ -98,6 +99,7 @@ struct sysc {
void (*clk_enable_quirk)(struct sysc *sysc); void (*clk_enable_quirk)(struct sysc *sysc);
void (*clk_disable_quirk)(struct sysc *sysc); void (*clk_disable_quirk)(struct sysc *sysc);
void (*reset_done_quirk)(struct sysc *sysc); void (*reset_done_quirk)(struct sysc *sysc);
void (*module_enable_quirk)(struct sysc *sysc);
}; };
static void sysc_parse_dts_quirks(struct sysc *ddata, struct device_node *np, static void sysc_parse_dts_quirks(struct sysc *ddata, struct device_node *np,
...@@ -613,8 +615,8 @@ static void sysc_check_quirk_stdout(struct sysc *ddata, ...@@ -613,8 +615,8 @@ static void sysc_check_quirk_stdout(struct sysc *ddata,
* node but children have "ti,hwmods". These belong to the interconnect * node but children have "ti,hwmods". These belong to the interconnect
* target node and are managed by this driver. * target node and are managed by this driver.
*/ */
static int sysc_check_one_child(struct sysc *ddata, static void sysc_check_one_child(struct sysc *ddata,
struct device_node *np) struct device_node *np)
{ {
const char *name; const char *name;
...@@ -624,22 +626,14 @@ static int sysc_check_one_child(struct sysc *ddata, ...@@ -624,22 +626,14 @@ static int sysc_check_one_child(struct sysc *ddata,
sysc_check_quirk_stdout(ddata, np); sysc_check_quirk_stdout(ddata, np);
sysc_parse_dts_quirks(ddata, np, true); sysc_parse_dts_quirks(ddata, np, true);
return 0;
} }
static int sysc_check_children(struct sysc *ddata) static void sysc_check_children(struct sysc *ddata)
{ {
struct device_node *child; struct device_node *child;
int error;
for_each_child_of_node(ddata->dev->of_node, child) { for_each_child_of_node(ddata->dev->of_node, child)
error = sysc_check_one_child(ddata, child); sysc_check_one_child(ddata, child);
if (error)
return error;
}
return 0;
} }
/* /*
...@@ -792,9 +786,7 @@ static int sysc_map_and_check_registers(struct sysc *ddata) ...@@ -792,9 +786,7 @@ static int sysc_map_and_check_registers(struct sysc *ddata)
if (error) if (error)
return error; return error;
error = sysc_check_children(ddata); sysc_check_children(ddata);
if (error)
return error;
error = sysc_parse_registers(ddata); error = sysc_parse_registers(ddata);
if (error) if (error)
...@@ -938,6 +930,9 @@ static int sysc_enable_module(struct device *dev) ...@@ -938,6 +930,9 @@ static int sysc_enable_module(struct device *dev)
sysc_write(ddata, ddata->offsets[SYSC_SYSCONFIG], reg); sysc_write(ddata, ddata->offsets[SYSC_SYSCONFIG], reg);
} }
if (ddata->module_enable_quirk)
ddata->module_enable_quirk(ddata);
return 0; return 0;
} }
...@@ -1251,6 +1246,9 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = { ...@@ -1251,6 +1246,9 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = {
SYSC_MODULE_QUIRK_I2C), SYSC_MODULE_QUIRK_I2C),
SYSC_QUIRK("i2c", 0, 0, 0x10, 0x90, 0x5040000a, 0xfffff0f0, SYSC_QUIRK("i2c", 0, 0, 0x10, 0x90, 0x5040000a, 0xfffff0f0,
SYSC_MODULE_QUIRK_I2C), SYSC_MODULE_QUIRK_I2C),
SYSC_QUIRK("gpu", 0x50000000, 0x14, -1, -1, 0x00010201, 0xffffffff, 0),
SYSC_QUIRK("gpu", 0x50000000, 0xfe00, 0xfe10, -1, 0x40000000 , 0xffffffff,
SYSC_MODULE_QUIRK_SGX),
SYSC_QUIRK("wdt", 0, 0, 0x10, 0x14, 0x502a0500, 0xfffff0f0, SYSC_QUIRK("wdt", 0, 0, 0x10, 0x14, 0x502a0500, 0xfffff0f0,
SYSC_MODULE_QUIRK_WDT), SYSC_MODULE_QUIRK_WDT),
...@@ -1266,8 +1264,11 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = { ...@@ -1266,8 +1264,11 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = {
SYSC_QUIRK("dcan", 0, 0x20, -1, -1, 0x4edb1902, 0xffffffff, 0), SYSC_QUIRK("dcan", 0, 0x20, -1, -1, 0x4edb1902, 0xffffffff, 0),
SYSC_QUIRK("dmic", 0, 0, 0x10, -1, 0x50010000, 0xffffffff, 0), SYSC_QUIRK("dmic", 0, 0, 0x10, -1, 0x50010000, 0xffffffff, 0),
SYSC_QUIRK("dwc3", 0, 0, 0x10, -1, 0x500a0200, 0xffffffff, 0), SYSC_QUIRK("dwc3", 0, 0, 0x10, -1, 0x500a0200, 0xffffffff, 0),
SYSC_QUIRK("d2d", 0x4a0b6000, 0, 0x10, 0x14, 0x00000010, 0xffffffff, 0),
SYSC_QUIRK("d2d", 0x4a0cd000, 0, 0x10, 0x14, 0x00000010, 0xffffffff, 0),
SYSC_QUIRK("epwmss", 0, 0, 0x4, -1, 0x47400001, 0xffffffff, 0), SYSC_QUIRK("epwmss", 0, 0, 0x4, -1, 0x47400001, 0xffffffff, 0),
SYSC_QUIRK("gpu", 0, 0x1fc00, 0x1fc10, -1, 0, 0, 0), SYSC_QUIRK("gpu", 0, 0x1fc00, 0x1fc10, -1, 0, 0, 0),
SYSC_QUIRK("gpu", 0, 0xfe00, 0xfe10, -1, 0x40000000 , 0xffffffff, 0),
SYSC_QUIRK("hsi", 0, 0, 0x10, 0x14, 0x50043101, 0xffffffff, 0), SYSC_QUIRK("hsi", 0, 0, 0x10, 0x14, 0x50043101, 0xffffffff, 0),
SYSC_QUIRK("iss", 0, 0, 0x10, -1, 0x40000101, 0xffffffff, 0), SYSC_QUIRK("iss", 0, 0, 0x10, -1, 0x40000101, 0xffffffff, 0),
SYSC_QUIRK("lcdc", 0, 0, 0x54, -1, 0x4f201000, 0xffffffff, 0), SYSC_QUIRK("lcdc", 0, 0, 0x54, -1, 0x4f201000, 0xffffffff, 0),
...@@ -1419,6 +1420,15 @@ static void sysc_clk_disable_quirk_i2c(struct sysc *ddata) ...@@ -1419,6 +1420,15 @@ static void sysc_clk_disable_quirk_i2c(struct sysc *ddata)
sysc_clk_quirk_i2c(ddata, false); sysc_clk_quirk_i2c(ddata, false);
} }
/* 36xx SGX needs a quirk for to bypass OCP IPG interrupt logic */
static void sysc_module_enable_quirk_sgx(struct sysc *ddata)
{
int offset = 0xff08; /* OCP_DEBUG_CONFIG */
u32 val = BIT(31); /* THALIA_INT_BYPASS */
sysc_write(ddata, offset, val);
}
/* Watchdog timer needs a disable sequence after reset */ /* Watchdog timer needs a disable sequence after reset */
static void sysc_reset_done_quirk_wdt(struct sysc *ddata) static void sysc_reset_done_quirk_wdt(struct sysc *ddata)
{ {
...@@ -1461,6 +1471,9 @@ static void sysc_init_module_quirks(struct sysc *ddata) ...@@ -1461,6 +1471,9 @@ static void sysc_init_module_quirks(struct sysc *ddata)
return; return;
} }
if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_SGX)
ddata->module_enable_quirk = sysc_module_enable_quirk_sgx;
if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_WDT) if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_WDT)
ddata->reset_done_quirk = sysc_reset_done_quirk_wdt; ddata->reset_done_quirk = sysc_reset_done_quirk_wdt;
} }
......
...@@ -49,6 +49,7 @@ struct sysc_regbits { ...@@ -49,6 +49,7 @@ struct sysc_regbits {
s8 emufree_shift; s8 emufree_shift;
}; };
#define SYSC_MODULE_QUIRK_SGX BIT(18)
#define SYSC_MODULE_QUIRK_HDQ1W BIT(17) #define SYSC_MODULE_QUIRK_HDQ1W BIT(17)
#define SYSC_MODULE_QUIRK_I2C BIT(16) #define SYSC_MODULE_QUIRK_I2C BIT(16)
#define SYSC_MODULE_QUIRK_WDT BIT(15) #define SYSC_MODULE_QUIRK_WDT BIT(15)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment