Skip to contentSkip to conversation

Patch "ASoC: fsl_ssi: remove explicit register defaults" has been added to the 4.5-stable tree

PATCH Applied [email protected] 3 participants 4 messages May 2, 2016

Subsystems (4)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

This is a note to let you know that I've just added the patch titled

ASoC: fsl_ssi: remove explicit register defaults

to the 4.5-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
asoc-fsl_ssi-remove-explicit-register-defaults.patch
and it can be found in the queue-4.5 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

Quoted 1 line

From 6139b1b184d5f6257f692dc814dbcd47e4cf90f1 Mon Sep 17 00:00:00 2001

From: "Maciej S. Szmigiero" <[email protected]>
Date: Mon, 18 Jan 2016 20:07:44 +0100
Subject: ASoC: fsl_ssi: remove explicit register defaults

From: Maciej S. Szmigiero <[email protected]>

commit 6139b1b184d5f6257f692dc814dbcd47e4cf90f1 upstream.

There is no guarantee that on fsl_ssi module load SSI registers will have their power-on-reset values.

In fact, if the driver is reloaded the values in registers will be whatever they were set to previously.

However, the cache needs to be fully populated at probe time to avoid non-atomic allocations during register access.

Special case here is imx21-class SSI, since according to datasheet it don't have SACC{ST,EN,DIS} regs.

This fixes hard lockup on fsl_ssi module reload,
at least in AC'97 mode.

Fixes 05cf237972fe ("ASoC: fsl_ssi: Add driver suspend and resume to support MEGA Fast")
---
 sound/soc/fsl/fsl_ssi.c |   42 ++++++++++++++++++++++--------------------
 1 file changed, 22 insertions(+), 20 deletions(-)
sound/soc/fsl/fsl_ssi.c +22 -20
@@ -112,20 +112,6 @@ struct fsl_ssi_rxtx_reg_val {
 	struct fsl_ssi_reg_val tx;
 };
 
-static const struct reg_default fsl_ssi_reg_defaults[] = {
-	{CCSR_SSI_SCR,     0x00000000},
-	{CCSR_SSI_SIER,    0x00003003},
-	{CCSR_SSI_STCR,    0x00000200},
-	{CCSR_SSI_SRCR,    0x00000200},
-	{CCSR_SSI_STCCR,   0x00040000},
-	{CCSR_SSI_SRCCR,   0x00040000},
-	{CCSR_SSI_SACNT,   0x00000000},
-	{CCSR_SSI_STMSK,   0x00000000},
-	{CCSR_SSI_SRMSK,   0x00000000},
-	{CCSR_SSI_SACCEN,  0x00000000},
-	{CCSR_SSI_SACCDIS, 0x00000000},
-};
-
 static bool fsl_ssi_readable_reg(struct device *dev, unsigned int reg)
 {
 	switch (reg) {
@@ -190,8 +176,7 @@ static const struct regmap_config fsl_ss
 	.val_bits = 32,
 	.reg_stride = 4,
 	.val_format_endian = REGMAP_ENDIAN_NATIVE,
-	.reg_defaults = fsl_ssi_reg_defaults,
-	.num_reg_defaults = ARRAY_SIZE(fsl_ssi_reg_defaults),
+	.num_reg_defaults_raw = CCSR_SSI_SACCDIS / sizeof(uint32_t) + 1,
 	.readable_reg = fsl_ssi_readable_reg,
 	.volatile_reg = fsl_ssi_volatile_reg,
 	.precious_reg = fsl_ssi_precious_reg,
@@ -201,6 +186,7 @@ static const struct regmap_config fsl_ss
 
 struct fsl_ssi_soc_data {
 	bool imx;
+	bool imx21regs; /* imx21-class SSI - no SACC{ST,EN,DIS} regs */
 	bool offline_config;
 	u32 sisr_write_mask;
 };
@@ -303,6 +289,7 @@ static struct fsl_ssi_soc_data fsl_ssi_m
 
 static struct fsl_ssi_soc_data fsl_ssi_imx21 = {
 	.imx = true,
+	.imx21regs = true,
 	.offline_config = true,
 	.sisr_write_mask = 0,
 };
@@ -586,8 +573,12 @@ static void fsl_ssi_setup_ac97(struct fs
 	 */
 	regmap_write(regs, CCSR_SSI_SACNT,
 			CCSR_SSI_SACNT_AC97EN | CCSR_SSI_SACNT_FV);
-	regmap_write(regs, CCSR_SSI_SACCDIS, 0xff);
-	regmap_write(regs, CCSR_SSI_SACCEN, 0x300);
+
+	/* no SACC{ST,EN,DIS} regs on imx21-class SSI */
+	if (!ssi_private->soc->imx21regs) {
+		regmap_write(regs, CCSR_SSI_SACCDIS, 0xff);
+		regmap_write(regs, CCSR_SSI_SACCEN, 0x300);
+	}
 
 	/*
 	 * Enable SSI, Transmit and Receive. AC97 has to communicate with the
@@ -1397,6 +1388,7 @@ static int fsl_ssi_probe(struct platform
 	struct resource *res;
 	void __iomem *iomem;
 	char name[64];
+	struct regmap_config regconfig = fsl_ssi_regconfig;
 
 	of_id = of_match_device(fsl_ssi_ids, &pdev->dev);
 	if (!of_id || !of_id->data)
@@ -1444,15 +1436,25 @@ static int fsl_ssi_probe(struct platform
 		return PTR_ERR(iomem);
 	ssi_private->ssi_phys = res->start;
 
+	if (ssi_private->soc->imx21regs) {
+		/*
+		 * According to datasheet imx21-class SSI
+		 * don't have SACC{ST,EN,DIS} regs.
+		 */
+		regconfig.max_register = CCSR_SSI_SRMSK;
+		regconfig.num_reg_defaults_raw =
+			CCSR_SSI_SRMSK / sizeof(uint32_t) + 1;
+	}
+
 	ret = of_property_match_string(np, "clock-names", "ipg");
 	if (ret < 0) {
 		ssi_private->has_ipg_clk_name = false;
 		ssi_private->regs = devm_regmap_init_mmio(&pdev->dev, iomem,
-			&fsl_ssi_regconfig);
+			&regconfig);
 	} else {
 		ssi_private->has_ipg_clk_name = true;
 		ssi_private->regs = devm_regmap_init_mmio_clk(&pdev->dev,
-			"ipg", iomem, &fsl_ssi_regconfig);
+			"ipg", iomem, &regconfig);
 	}
 	if (IS_ERR(ssi_private->regs)) {
 		dev_err(&pdev->dev, "Failed to init register map\n");

Patches currently in stable-queue which might be from [email protected] are

queue-4.5/asoc-fsl_ssi-remove-explicit-register-defaults.patch

Tested-by Applied
#1 lore raw

[Sorry for the top post]

I think this one should not be applied to 4.5 stable.

This commit was originally applied as 6139b1b184d5f62 and it caused issues. It was reverted by 56e5fd8feb286ab71.

After some regmap changes that went into 4.6-rc, it was possible to use the original commit and it was applied again as 6139b1b184d5f6257f6.

So for 4.5 I would suggest not applying it.

Thanks

________________________________________
From: [email protected] <[email protected]>
Sent: Sunday, May 1, 2016 9:02:26 PM
To: [email protected]; [email protected]; Fabio Estevam; [email protected]
Cc: [email protected]; [email protected]
Subject: Patch "ASoC: fsl_ssi: remove explicit register defaults" has been added to the 4.5-stable tree

This is a note to let you know that I've just added the patch titled

ASoC: fsl_ssi: remove explicit register defaults

to the 4.5-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
asoc-fsl_ssi-remove-explicit-register-defaults.patch
and it can be found in the queue-4.5 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

Quoted 1 line

From 6139b1b184d5f6257f692dc814dbcd47e4cf90f1 Mon Sep 17 00:00:00 2001

From: "Maciej S. Szmigiero" <[email protected]>
Date: Mon, 18 Jan 2016 20:07:44 +0100
Subject: ASoC: fsl_ssi: remove explicit register defaults

From: Maciej S. Szmigiero <[email protected]>

commit 6139b1b184d5f6257f692dc814dbcd47e4cf90f1 upstream.

There is no guarantee that on fsl_ssi module load SSI registers will have their power-on-reset values.

In fact, if the driver is reloaded the values in registers will be whatever they were set to previously.

However, the cache needs to be fully populated at probe time to avoid non-atomic allocations during register access.

Special case here is imx21-class SSI, since according to datasheet it don't have SACC{ST,EN,DIS} regs.

This fixes hard lockup on fsl_ssi module reload,
at least in AC'97 mode.

Fixes 05cf237972fe ("ASoC: fsl_ssi: Add driver suspend and resume to support MEGA Fast")
---
 sound/soc/fsl/fsl_ssi.c |   42 ++++++++++++++++++++++--------------------
 1 file changed, 22 insertions(+), 20 deletions(-)
sound/soc/fsl/fsl_ssi.c +22 -20
@@ -112,20 +112,6 @@ struct fsl_ssi_rxtx_reg_val {
        struct fsl_ssi_reg_val tx;
 };
 
-static const struct reg_default fsl_ssi_reg_defaults[] = {
-       {CCSR_SSI_SCR,     0x00000000},
-       {CCSR_SSI_SIER,    0x00003003},
-       {CCSR_SSI_STCR,    0x00000200},
-       {CCSR_SSI_SRCR,    0x00000200},
-       {CCSR_SSI_STCCR,   0x00040000},
-       {CCSR_SSI_SRCCR,   0x00040000},
-       {CCSR_SSI_SACNT,   0x00000000},
-       {CCSR_SSI_STMSK,   0x00000000},
-       {CCSR_SSI_SRMSK,   0x00000000},
-       {CCSR_SSI_SACCEN,  0x00000000},
-       {CCSR_SSI_SACCDIS, 0x00000000},
-};
-
 static bool fsl_ssi_readable_reg(struct device *dev, unsigned int reg)
 {
        switch (reg) {
@@ -190,8 +176,7 @@ static const struct regmap_config fsl_ss
        .val_bits = 32,
        .reg_stride = 4,
        .val_format_endian = REGMAP_ENDIAN_NATIVE,
-       .reg_defaults = fsl_ssi_reg_defaults,
-       .num_reg_defaults = ARRAY_SIZE(fsl_ssi_reg_defaults),
+       .num_reg_defaults_raw = CCSR_SSI_SACCDIS / sizeof(uint32_t) + 1,
        .readable_reg = fsl_ssi_readable_reg,
        .volatile_reg = fsl_ssi_volatile_reg,
        .precious_reg = fsl_ssi_precious_reg,
@@ -201,6 +186,7 @@ static const struct regmap_config fsl_ss
 
 struct fsl_ssi_soc_data {
        bool imx;
+       bool imx21regs; /* imx21-class SSI - no SACC{ST,EN,DIS} regs */
        bool offline_config;
        u32 sisr_write_mask;
 };
@@ -303,6 +289,7 @@ static struct fsl_ssi_soc_data fsl_ssi_m
 
 static struct fsl_ssi_soc_data fsl_ssi_imx21 = {
        .imx = true,
+       .imx21regs = true,
        .offline_config = true,
        .sisr_write_mask = 0,
 };
@@ -586,8 +573,12 @@ static void fsl_ssi_setup_ac97(struct fs
         */
        regmap_write(regs, CCSR_SSI_SACNT,
                        CCSR_SSI_SACNT_AC97EN | CCSR_SSI_SACNT_FV);
-       regmap_write(regs, CCSR_SSI_SACCDIS, 0xff);
-       regmap_write(regs, CCSR_SSI_SACCEN, 0x300);
+
+       /* no SACC{ST,EN,DIS} regs on imx21-class SSI */
+       if (!ssi_private->soc->imx21regs) {
+               regmap_write(regs, CCSR_SSI_SACCDIS, 0xff);
+               regmap_write(regs, CCSR_SSI_SACCEN, 0x300);
+       }
 
        /*
         * Enable SSI, Transmit and Receive. AC97 has to communicate with the
@@ -1397,6 +1388,7 @@ static int fsl_ssi_probe(struct platform
        struct resource *res;
        void __iomem *iomem;
        char name[64];
+       struct regmap_config regconfig = fsl_ssi_regconfig;
 
        of_id = of_match_device(fsl_ssi_ids, &pdev->dev);
        if (!of_id || !of_id->data)
@@ -1444,15 +1436,25 @@ static int fsl_ssi_probe(struct platform
                return PTR_ERR(iomem);
        ssi_private->ssi_phys = res->start;
 
+       if (ssi_private->soc->imx21regs) {
+               /*
+                * According to datasheet imx21-class SSI
+                * don't have SACC{ST,EN,DIS} regs.
+                */
+               regconfig.max_register = CCSR_SSI_SRMSK;
+               regconfig.num_reg_defaults_raw =
+                       CCSR_SSI_SRMSK / sizeof(uint32_t) + 1;
+       }
+
        ret = of_property_match_string(np, "clock-names", "ipg");
        if (ret < 0) {
                ssi_private->has_ipg_clk_name = false;
                ssi_private->regs = devm_regmap_init_mmio(&pdev->dev, iomem,
-                       &fsl_ssi_regconfig);
+                       &regconfig);
        } else {
                ssi_private->has_ipg_clk_name = true;
                ssi_private->regs = devm_regmap_init_mmio_clk(&pdev->dev,
-                       "ipg", iomem, &fsl_ssi_regconfig);
+                       "ipg", iomem, &regconfig);
        }
        if (IS_ERR(ssi_private->regs)) {
                dev_err(&pdev->dev, "Failed to init register map\n");

Patches currently in stable-queue which might be from [email protected] are

queue-4.5/asoc-fsl_ssi-remove-explicit-register-defaults.patch

reviewer
#2 lore raw
Quoted 5 lines · Fabio Estevam

[Sorry for the top post]

I think this one should not be applied to 4.5 stable.

This commit was originally applied as 6139b1b184d5f62 and it caused issues. It was reverted by

I meant: "This commit was originally applied as
5c408fee254633a5be69505bc86c6b034f871ab4"

56e5fd8feb286ab71.

Quoted 6 lines

After some regmap changes that went into 4.6-rc, it was possible to use the original commit and it was applied again as 6139b1b184d5f6257f6.

So for 4.5 I would suggest not applying it.

Thanks

author maintainer
#3 lore raw
Quoted 15 lines · Fabio Estevam
Quoted 5 lines · Fabio Estevam

[Sorry for the top post]

I think this one should not be applied to 4.5 stable.

This commit was originally applied as 6139b1b184d5f62 and it caused issues. It was reverted by

I meant: "This commit was originally applied as
5c408fee254633a5be69505bc86c6b034f871ab4"

56e5fd8feb286ab71.

Quoted 4 lines

After some regmap changes that went into 4.6-rc, it was possible to use the original commit and it was applied again as 6139b1b184d5f6257f6.

So for 4.5 I would suggest not applying it.

Thanks for letting me know, now dropped.

greg k-h