soundwire: extend SDW_SLAVE_ENTRY
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Mon, 8 Jun 2020 20:54:35 +0000 (04:54 +0800)
committerVinod Koul <vkoul@kernel.org>
Tue, 30 Jun 2020 15:56:17 +0000 (21:26 +0530)
The SoundWire 1.2 specification adds new capabilities that were not
present in previous version, such as the class ID.

To enable support for class drivers, and well as drivers that address
a specific version, all fields of the sdw_device_id structure need to
be exposed. For SoundWire 1.0 and 1.1 devices, a wildcard is used so
class and version information are ignored.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Rander Wang <rander.wang@linux.intel.com>
Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Link: https://lore.kernel.org/r/20200608205436.2402-4-yung-chuan.liao@linux.intel.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/soundwire/bus_type.c
include/linux/mod_devicetable.h
include/linux/soundwire/sdw.h
scripts/mod/devicetable-offsets.c
scripts/mod/file2alias.c

index c8d948c09d9dc2a14db82459d69f77ff3a915767..6fba55898cf025324761f20db456e748955a64f5 100644 (file)
@@ -24,7 +24,11 @@ sdw_get_device_id(struct sdw_slave *slave, struct sdw_driver *drv)
 
        for (id = drv->id_table; id && id->mfg_id; id++)
                if (slave->id.mfg_id == id->mfg_id &&
-                   slave->id.part_id == id->part_id)
+                   slave->id.part_id == id->part_id  &&
+                   (!id->sdw_version ||
+                    slave->id.sdw_version == id->sdw_version) &&
+                   (!id->class_id ||
+                    slave->id.class_id == id->class_id))
                        return id;
 
        return NULL;
@@ -47,10 +51,11 @@ static int sdw_bus_match(struct device *dev, struct device_driver *ddrv)
 
 int sdw_slave_modalias(const struct sdw_slave *slave, char *buf, size_t size)
 {
-       /* modalias is sdw:m<mfg_id>p<part_id> */
+       /* modalias is sdw:m<mfg_id>p<part_id>v<version>c<class_id> */
 
-       return snprintf(buf, size, "sdw:m%04Xp%04X\n",
-                       slave->id.mfg_id, slave->id.part_id);
+       return snprintf(buf, size, "sdw:m%04Xp%04Xv%02Xc%02X\n",
+                       slave->id.mfg_id, slave->id.part_id,
+                       slave->id.sdw_version, slave->id.class_id);
 }
 
 int sdw_slave_uevent(struct device *dev, struct kobj_uevent_env *env)
index 8d764aab29de9b729ff8209a6206c3d323830197..f8585e3a2c431749f8cc4fbb62bd1a9b8d94ef95 100644 (file)
@@ -251,6 +251,8 @@ struct hda_device_id {
 struct sdw_device_id {
        __u16 mfg_id;
        __u16 part_id;
+       __u8  sdw_version;
+       __u8  class_id;
        kernel_ulong_t driver_data;
 };
 
index 9c27a32df9bbd84b7a4cf5b427d6215fd0e56f51..64c9314cb903cc067a9559c20f88d329a1f2a8b0 100644 (file)
@@ -426,8 +426,7 @@ int sdw_slave_read_prop(struct sdw_slave *slave);
  * struct sdw_slave_id - Slave ID
  * @mfg_id: MIPI Manufacturer ID
  * @part_id: Device Part ID
- * @class_id: MIPI Class ID, unused now.
- * Currently a placeholder in MIPI SoundWire Spec
+ * @class_id: MIPI Class ID (defined starting with SoundWire 1.2 spec)
  * @unique_id: Device unique ID
  * @sdw_version: SDW version implemented
  *
@@ -659,10 +658,14 @@ struct sdw_driver {
        struct device_driver driver;
 };
 
-#define SDW_SLAVE_ENTRY(_mfg_id, _part_id, _drv_data) \
-       { .mfg_id = (_mfg_id), .part_id = (_part_id), \
+#define SDW_SLAVE_ENTRY_EXT(_mfg_id, _part_id, _version, _c_id, _drv_data) \
+       { .mfg_id = (_mfg_id), .part_id = (_part_id),           \
+         .sdw_version = (_version), .class_id = (_c_id),       \
          .driver_data = (unsigned long)(_drv_data) }
 
+#define SDW_SLAVE_ENTRY(_mfg_id, _part_id, _drv_data)  \
+       SDW_SLAVE_ENTRY_EXT((_mfg_id), (_part_id), 0, 0, (_drv_data))
+
 int sdw_handle_slave_status(struct sdw_bus *bus,
                        enum sdw_slave_status status[]);
 
index 010be8ba21160ea1d462ae703c7c5df62c756fe5..27007c18e75428cb88baa4d1eb7e1d3429bba30b 100644 (file)
@@ -216,6 +216,8 @@ int main(void)
        DEVID(sdw_device_id);
        DEVID_FIELD(sdw_device_id, mfg_id);
        DEVID_FIELD(sdw_device_id, part_id);
+       DEVID_FIELD(sdw_device_id, sdw_version);
+       DEVID_FIELD(sdw_device_id, class_id);
 
        DEVID(fsl_mc_device_id);
        DEVID_FIELD(fsl_mc_device_id, vendor);
index 9599e2a3f1e614a586349e25a3f96bd090624a7b..2417dd1dee33cb92ecce63bd89a7bca798f8295c 100644 (file)
@@ -1258,15 +1258,19 @@ static int do_hda_entry(const char *filename, void *symval, char *alias)
        return 1;
 }
 
-/* Looks like: sdw:mNpN */
+/* Looks like: sdw:mNpNvNcN */
 static int do_sdw_entry(const char *filename, void *symval, char *alias)
 {
        DEF_FIELD(symval, sdw_device_id, mfg_id);
        DEF_FIELD(symval, sdw_device_id, part_id);
+       DEF_FIELD(symval, sdw_device_id, sdw_version);
+       DEF_FIELD(symval, sdw_device_id, class_id);
 
        strcpy(alias, "sdw:");
        ADD(alias, "m", mfg_id != 0, mfg_id);
        ADD(alias, "p", part_id != 0, part_id);
+       ADD(alias, "v", sdw_version != 0, sdw_version);
+       ADD(alias, "c", class_id != 0, class_id);
 
        add_wildcard(alias);
        return 1;