intel_th: pci: Use drvdata for quirks
authorAlexander Shishkin <alexander.shishkin@linux.intel.com>
Fri, 18 Aug 2017 14:57:35 +0000 (17:57 +0300)
committerAlexander Shishkin <alexander.shishkin@linux.intel.com>
Fri, 25 Aug 2017 15:47:59 +0000 (18:47 +0300)
Allow attaching miscellaneous quirk information to devices as drvdata.

Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
drivers/hwtracing/intel_th/core.c
drivers/hwtracing/intel_th/intel_th.h
drivers/hwtracing/intel_th/pci.c

index d176000..e915ab2 100644 (file)
@@ -576,6 +576,7 @@ intel_th_subdevice_alloc(struct intel_th *th,
        if (!thdev)
                return ERR_PTR(-ENOMEM);
 
+       thdev->drvdata = th->drvdata;
 
        memcpy(res, subdev->res,
               sizeof(struct resource) * subdev->nres);
@@ -789,8 +790,8 @@ static const struct file_operations intel_th_output_fops = {
  * @irq:       irq number
  */
 struct intel_th *
-intel_th_alloc(struct device *dev, struct resource *devres,
-              unsigned int ndevres, int irq)
+intel_th_alloc(struct device *dev, struct intel_th_drvdata *drvdata,
+              struct resource *devres, unsigned int ndevres, int irq)
 {
        struct intel_th *th;
        int err;
@@ -812,6 +813,7 @@ intel_th_alloc(struct device *dev, struct resource *devres,
                goto err_ida;
        }
        th->dev = dev;
+       th->drvdata = drvdata;
 
        th->resource = devres;
        th->num_resources = ndevres;
index 3f45584..6824460 100644 (file)
@@ -48,8 +48,19 @@ struct intel_th_output {
 };
 
 /**
+ * struct intel_th_drvdata - describes hardware capabilities and quirks
+ * @tscu_enable:       device needs SW to enable time stamping unit
+ */
+struct intel_th_drvdata {
+       unsigned int    tscu_enable        : 1;
+};
+
+#define INTEL_TH_CAP(_th, _cap) ((_th)->drvdata ? (_th)->drvdata->_cap : 0)
+
+/**
  * struct intel_th_device - device on the intel_th bus
  * @dev:               device
+ * @drvdata:           hardware capabilities/quirks
  * @resource:          array of resources available to this device
  * @num_resources:     number of resources in @resource array
  * @type:              INTEL_TH_{SOURCE,OUTPUT,SWITCH}
@@ -59,11 +70,12 @@ struct intel_th_output {
  * @name:              device name to match the driver
  */
 struct intel_th_device {
-       struct device   dev;
-       struct resource *resource;
-       unsigned int    num_resources;
-       unsigned int    type;
-       int             id;
+       struct device           dev;
+       struct intel_th_drvdata *drvdata;
+       struct resource         *resource;
+       unsigned int            num_resources;
+       unsigned int            type;
+       int                     id;
 
        /* INTEL_TH_SWITCH specific */
        bool                    host_mode;
@@ -206,8 +218,8 @@ static inline struct intel_th *to_intel_th(struct intel_th_device *thdev)
 }
 
 struct intel_th *
-intel_th_alloc(struct device *dev, struct resource *devres,
-              unsigned int ndevres, int irq);
+intel_th_alloc(struct device *dev, struct intel_th_drvdata *drvdata,
+              struct resource *devres, unsigned int ndevres, int irq);
 void intel_th_free(struct intel_th *th);
 
 int intel_th_driver_register(struct intel_th_driver *thdrv);
@@ -248,6 +260,7 @@ struct intel_th {
 
        struct intel_th_device  *thdev[TH_SUBDEVICE_MAX];
        struct intel_th_device  *hub;
+       struct intel_th_drvdata *drvdata;
 
        struct resource         *resource;
        unsigned int            num_thdevs;
index 5a9a9e8..aed6d59 100644 (file)
@@ -30,6 +30,7 @@
 static int intel_th_pci_probe(struct pci_dev *pdev,
                              const struct pci_device_id *id)
 {
+       struct intel_th_drvdata *drvdata = (void *)id->driver_data;
        struct intel_th *th;
        int err;
 
@@ -41,7 +42,7 @@ static int intel_th_pci_probe(struct pci_dev *pdev,
        if (err)
                return err;
 
-       th = intel_th_alloc(&pdev->dev, pdev->resource,
+       th = intel_th_alloc(&pdev->dev, drvdata, pdev->resource,
                            DEVICE_COUNT_RESOURCE, pdev->irq);
        if (IS_ERR(th))
                return PTR_ERR(th);