aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/fsl
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/fsl')
-rw-r--r--sound/soc/fsl/fsl_ssi.c32
1 files changed, 24 insertions, 8 deletions
diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c
index e483e9d84f8b..671be33aa9d2 100644
--- a/sound/soc/fsl/fsl_ssi.c
+++ b/sound/soc/fsl/fsl_ssi.c
@@ -123,6 +123,13 @@ static inline void write_ssi_mask(u32 __iomem *addr, u32 clear, u32 set)
123 CCSR_SSI_SIER_TUE0_EN | CCSR_SSI_SIER_TFRC_EN) 123 CCSR_SSI_SIER_TUE0_EN | CCSR_SSI_SIER_TFRC_EN)
124#define FSLSSI_SISR_MASK (FSLSSI_SIER_DBG_RX_FLAGS | FSLSSI_SIER_DBG_TX_FLAGS) 124#define FSLSSI_SISR_MASK (FSLSSI_SIER_DBG_RX_FLAGS | FSLSSI_SIER_DBG_TX_FLAGS)
125 125
126
127enum fsl_ssi_type {
128 FSL_SSI_MCP8610,
129 FSL_SSI_MX21,
130 FSL_SSI_MX51,
131};
132
126/** 133/**
127 * fsl_ssi_private: per-SSI private data 134 * fsl_ssi_private: per-SSI private data
128 * 135 *
@@ -189,6 +196,14 @@ struct fsl_ssi_private {
189 char name[1]; 196 char name[1];
190}; 197};
191 198
199static const struct of_device_id fsl_ssi_ids[] = {
200 { .compatible = "fsl,mpc8610-ssi", .data = (void *) FSL_SSI_MCP8610},
201 { .compatible = "fsl,imx51-ssi", .data = (void *) FSL_SSI_MX51},
202 { .compatible = "fsl,imx21-ssi", .data = (void *) FSL_SSI_MX21},
203 {}
204};
205MODULE_DEVICE_TABLE(of, fsl_ssi_ids);
206
192/** 207/**
193 * fsl_ssi_isr: SSI interrupt handler 208 * fsl_ssi_isr: SSI interrupt handler
194 * 209 *
@@ -1118,6 +1133,8 @@ static int fsl_ssi_probe(struct platform_device *pdev)
1118 int ret = 0; 1133 int ret = 0;
1119 struct device_attribute *dev_attr = NULL; 1134 struct device_attribute *dev_attr = NULL;
1120 struct device_node *np = pdev->dev.of_node; 1135 struct device_node *np = pdev->dev.of_node;
1136 const struct of_device_id *of_id;
1137 enum fsl_ssi_type hw_type;
1121 const char *p, *sprop; 1138 const char *p, *sprop;
1122 const uint32_t *iprop; 1139 const uint32_t *iprop;
1123 struct resource res; 1140 struct resource res;
@@ -1132,6 +1149,11 @@ static int fsl_ssi_probe(struct platform_device *pdev)
1132 if (!of_device_is_available(np)) 1149 if (!of_device_is_available(np))
1133 return -ENODEV; 1150 return -ENODEV;
1134 1151
1152 of_id = of_match_device(fsl_ssi_ids, &pdev->dev);
1153 if (!of_id)
1154 return -EINVAL;
1155 hw_type = (enum fsl_ssi_type) of_id->data;
1156
1135 /* We only support the SSI in "I2S Slave" mode */ 1157 /* We only support the SSI in "I2S Slave" mode */
1136 sprop = of_get_property(np, "fsl,mode", NULL); 1158 sprop = of_get_property(np, "fsl,mode", NULL);
1137 if (!sprop) { 1159 if (!sprop) {
@@ -1211,7 +1233,8 @@ static int fsl_ssi_probe(struct platform_device *pdev)
1211 ssi_private->baudclk_locked = false; 1233 ssi_private->baudclk_locked = false;
1212 spin_lock_init(&ssi_private->baudclk_lock); 1234 spin_lock_init(&ssi_private->baudclk_lock);
1213 1235
1214 if (of_device_is_compatible(pdev->dev.of_node, "fsl,imx21-ssi")) { 1236 if (hw_type == FSL_SSI_MX21 || hw_type == FSL_SSI_MX51 ||
1237 hw_type == FSL_SSI_MX35) {
1215 u32 dma_events[2]; 1238 u32 dma_events[2];
1216 ssi_private->ssi_on_imx = true; 1239 ssi_private->ssi_on_imx = true;
1217 1240
@@ -1414,13 +1437,6 @@ static int fsl_ssi_remove(struct platform_device *pdev)
1414 return 0; 1437 return 0;
1415} 1438}
1416 1439
1417static const struct of_device_id fsl_ssi_ids[] = {
1418 { .compatible = "fsl,mpc8610-ssi", },
1419 { .compatible = "fsl,imx21-ssi", },
1420 {}
1421};
1422MODULE_DEVICE_TABLE(of, fsl_ssi_ids);
1423
1424static struct platform_driver fsl_ssi_driver = { 1440static struct platform_driver fsl_ssi_driver = {
1425 .driver = { 1441 .driver = {
1426 .name = "fsl-ssi-dai", 1442 .name = "fsl-ssi-dai",