|
@@ -112,6 +112,20 @@ 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) {
|
|
@@ -176,7 +190,8 @@ static const struct regmap_config fsl_ssi_regconfig = {
|
|
|
.val_bits = 32,
|
|
|
.reg_stride = 4,
|
|
|
.val_format_endian = REGMAP_ENDIAN_NATIVE,
|
|
|
- .num_reg_defaults_raw = CCSR_SSI_SACCDIS / sizeof(uint32_t) + 1,
|
|
|
+ .reg_defaults = fsl_ssi_reg_defaults,
|
|
|
+ .num_reg_defaults = ARRAY_SIZE(fsl_ssi_reg_defaults),
|
|
|
.readable_reg = fsl_ssi_readable_reg,
|
|
|
.volatile_reg = fsl_ssi_volatile_reg,
|
|
|
.precious_reg = fsl_ssi_precious_reg,
|
|
@@ -186,7 +201,6 @@ static const struct regmap_config fsl_ssi_regconfig = {
|
|
|
|
|
|
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;
|
|
|
};
|
|
@@ -289,7 +303,6 @@ static struct fsl_ssi_soc_data fsl_ssi_mpc8610 = {
|
|
|
|
|
|
static struct fsl_ssi_soc_data fsl_ssi_imx21 = {
|
|
|
.imx = true,
|
|
|
- .imx21regs = true,
|
|
|
.offline_config = true,
|
|
|
.sisr_write_mask = 0,
|
|
|
};
|
|
@@ -573,12 +586,8 @@ static void fsl_ssi_setup_ac97(struct fsl_ssi_private *ssi_private)
|
|
|
*/
|
|
|
regmap_write(regs, CCSR_SSI_SACNT,
|
|
|
CCSR_SSI_SACNT_AC97EN | CCSR_SSI_SACNT_FV);
|
|
|
-
|
|
|
- /* 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);
|
|
|
- }
|
|
|
+ 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
|
|
@@ -1388,7 +1397,6 @@ static int fsl_ssi_probe(struct platform_device *pdev)
|
|
|
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)
|
|
@@ -1436,25 +1444,15 @@ static int fsl_ssi_probe(struct platform_device *pdev)
|
|
|
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,
|
|
|
- ®config);
|
|
|
+ &fsl_ssi_regconfig);
|
|
|
} else {
|
|
|
ssi_private->has_ipg_clk_name = true;
|
|
|
ssi_private->regs = devm_regmap_init_mmio_clk(&pdev->dev,
|
|
|
- "ipg", iomem, ®config);
|
|
|
+ "ipg", iomem, &fsl_ssi_regconfig);
|
|
|
}
|
|
|
if (IS_ERR(ssi_private->regs)) {
|
|
|
dev_err(&pdev->dev, "Failed to init register map\n");
|