Patch "ASoC: fsl_ssi: remove explicit register defaults" has been added to the 4.5-stable tree
Subsystems (4)
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
6139b1b184d5f6257f692dc814dbcd47e4cf90f1Mon 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.
--- 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_ssstruct 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_mstatic 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 platformstruct 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 platformreturn 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); + ®config); }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, ®config); }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
[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
6139b1b184d5f6257f692dc814dbcd47e4cf90f1Mon 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.
--- 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_ssstruct 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_mstatic 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 platformstruct 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 platformreturn 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); + ®config); }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, ®config); }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
Fabio Estevam
reviewerQuoted 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
6139b1b184d5f62and it caused issues. It was reverted by
I meant: "This commit was originally applied as5c408fee254633a5be69505bc86c6b034f871ab4"
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
[email protected]
maintainerQuoted 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
6139b1b184d5f62and it caused issues. It was reverted byI 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