Re: [PATCH v2 1/8] i2c-mux: add common core data for every mux instance

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Guenter,

[BTW, if anyone feels spammed by this series, please drop me a note]

On 2016-01-05 17:42, Guenter Roeck wrote:
> On 01/05/2016 07:57 AM, Peter Rosin wrote:
>> From: Peter Rosin <peda@xxxxxxxxxx>
>>
>> The initial core mux structure starts off small with only the parent
>> adapter pointer, which all muxes have, and a priv pointer for mux
>> driver private data.
>>
>> Add i2c_mux_alloc function to unify the creation of a mux.
>>
>> Where appropriate, pass around the mux core structure instead of the
>> parent adapter or the driver private data.
>>
>> Remove the parent adapter pointer from the driver private data for all
>> mux drivers.
>>
>> Signed-off-by: Peter Rosin <peda@xxxxxxxxxx>
>> ---
>>   drivers/i2c/i2c-mux.c                        | 28 +++++++++++++++++-----
>>   drivers/i2c/muxes/i2c-arb-gpio-challenge.c   | 24 +++++++++----------
>>   drivers/i2c/muxes/i2c-mux-gpio.c             | 20 ++++++++--------
>>   drivers/i2c/muxes/i2c-mux-pca9541.c          | 35 ++++++++++++++--------------
>>   drivers/i2c/muxes/i2c-mux-pca954x.c          | 19 ++++++++++-----
>>   drivers/i2c/muxes/i2c-mux-pinctrl.c          | 23 +++++++++---------
>>   drivers/i2c/muxes/i2c-mux-reg.c              | 23 ++++++++++--------
>>   drivers/iio/imu/inv_mpu6050/inv_mpu_core.c   | 10 +++++++-
>>   drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h    |  1 +
>>   drivers/media/dvb-frontends/m88ds3103.c      | 10 +++++++-
>>   drivers/media/dvb-frontends/m88ds3103_priv.h |  1 +
>>   drivers/media/dvb-frontends/rtl2830.c        | 10 +++++++-
>>   drivers/media/dvb-frontends/rtl2830_priv.h   |  1 +
>>   drivers/media/dvb-frontends/rtl2832.c        | 10 +++++++-
>>   drivers/media/dvb-frontends/rtl2832_priv.h   |  1 +
>>   drivers/media/dvb-frontends/si2168.c         | 10 +++++++-
>>   drivers/media/dvb-frontends/si2168_priv.h    |  1 +
>>   drivers/media/usb/cx231xx/cx231xx-core.c     |  3 +++
>>   drivers/media/usb/cx231xx/cx231xx-i2c.c      | 13 +++++++++--
>>   drivers/media/usb/cx231xx/cx231xx.h          |  2 ++
>>   drivers/of/unittest.c                        | 16 +++++++------
>>   include/linux/i2c-mux.h                      | 14 ++++++++++-
>>   22 files changed, 187 insertions(+), 88 deletions(-)
>>
>> diff --git a/drivers/i2c/i2c-mux.c b/drivers/i2c/i2c-mux.c
>> index 00fc5b1c7b66..c2163f6b51d5 100644
>> --- a/drivers/i2c/i2c-mux.c
>> +++ b/drivers/i2c/i2c-mux.c
>> @@ -31,8 +31,8 @@
>>   struct i2c_mux_priv {
>>       struct i2c_adapter adap;
>>       struct i2c_algorithm algo;
>> +    struct i2c_mux_core *muxc;
>>
>> -    struct i2c_adapter *parent;
>>       struct device *mux_dev;
>>       void *mux_priv;
>>       u32 chan_id;
>> @@ -45,7 +45,8 @@ static int i2c_mux_master_xfer(struct i2c_adapter *adap,
>>                      struct i2c_msg msgs[], int num)
>>   {
>>       struct i2c_mux_priv *priv = adap->algo_data;
>> -    struct i2c_adapter *parent = priv->parent;
>> +    struct i2c_mux_core *muxc = priv->muxc;
>> +    struct i2c_adapter *parent = muxc->parent;
>>       int ret;
>>
>>       /* Switch to the right mux port and perform the transfer. */
>> @@ -65,7 +66,8 @@ static int i2c_mux_smbus_xfer(struct i2c_adapter *adap,
>>                     int size, union i2c_smbus_data *data)
>>   {
>>       struct i2c_mux_priv *priv = adap->algo_data;
>> -    struct i2c_adapter *parent = priv->parent;
>> +    struct i2c_mux_core *muxc = priv->muxc;
>> +    struct i2c_adapter *parent = muxc->parent;
>>       int ret;
>>
>>       /* Select the right mux port and perform the transfer. */
>> @@ -84,7 +86,7 @@ static int i2c_mux_smbus_xfer(struct i2c_adapter *adap,
>>   static u32 i2c_mux_functionality(struct i2c_adapter *adap)
>>   {
>>       struct i2c_mux_priv *priv = adap->algo_data;
>> -    struct i2c_adapter *parent = priv->parent;
>> +    struct i2c_adapter *parent = priv->muxc->parent;
>>
>>       return parent->algo->functionality(parent);
>>   }
>> @@ -102,7 +104,20 @@ static unsigned int i2c_mux_parent_classes(struct i2c_adapter *parent)
>>       return class;
>>   }
>>
>> -struct i2c_adapter *i2c_add_mux_adapter(struct i2c_adapter *parent,
>> +struct i2c_mux_core *i2c_mux_alloc(struct device *dev, int sizeof_priv)
>> +{
>> +    struct i2c_mux_core *muxc;
>> +
>> +    muxc = devm_kzalloc(dev, sizeof(*muxc) + sizeof_priv, GFP_KERNEL);
>> +    if (!muxc)
>> +        return NULL;
>> +    if (sizeof_priv)
>> +        muxc->priv = muxc + 1;
>> +    return muxc;
>> +}
>> +EXPORT_SYMBOL_GPL(i2c_mux_alloc);
>> +
>> +struct i2c_adapter *i2c_add_mux_adapter(struct i2c_mux_core *muxc,
>>                   struct device *mux_dev,
>>                   void *mux_priv, u32 force_nr, u32 chan_id,
>>                   unsigned int class,
>> @@ -111,6 +126,7 @@ struct i2c_adapter *i2c_add_mux_adapter(struct i2c_adapter *parent,
>>                   int (*deselect) (struct i2c_adapter *,
>>                            void *, u32))
>>   {
>> +    struct i2c_adapter *parent = muxc->parent;
>>       struct i2c_mux_priv *priv;
>>       char symlink_name[20];
>>       int ret;
>> @@ -120,7 +136,7 @@ struct i2c_adapter *i2c_add_mux_adapter(struct i2c_adapter *parent,
>>           return NULL;
>>
>>       /* Set up private adapter data */
>> -    priv->parent = parent;
>> +    priv->muxc = muxc;
>>       priv->mux_dev = mux_dev;
>>       priv->mux_priv = mux_priv;
>>       priv->chan_id = chan_id;
>> diff --git a/drivers/i2c/muxes/i2c-arb-gpio-challenge.c b/drivers/i2c/muxes/i2c-arb-gpio-challenge.c
>> index 402e3a6c671a..6e27ea4fb25a 100644
>> --- a/drivers/i2c/muxes/i2c-arb-gpio-challenge.c
>> +++ b/drivers/i2c/muxes/i2c-arb-gpio-challenge.c
>> @@ -42,7 +42,6 @@
>>    */
>>
>>   struct i2c_arbitrator_data {
>> -    struct i2c_adapter *parent;
>>       struct i2c_adapter *child;
>>       int our_gpio;
>>       int our_gpio_release;
>> @@ -119,6 +118,7 @@ static int i2c_arbitrator_probe(struct platform_device *pdev)
>>       struct device *dev = &pdev->dev;
>>       struct device_node *np = dev->of_node;
>>       struct device_node *parent_np;
>> +    struct i2c_mux_core *muxc;
>>       struct i2c_arbitrator_data *arb;
>>       enum of_gpio_flags gpio_flags;
>>       unsigned long out_init;
>> @@ -134,13 +134,12 @@ static int i2c_arbitrator_probe(struct platform_device *pdev)
>>           return -EINVAL;
>>       }
>>
>> -    arb = devm_kzalloc(dev, sizeof(*arb), GFP_KERNEL);
>> -    if (!arb) {
>> -        dev_err(dev, "Cannot allocate i2c_arbitrator_data\n");
>> +    muxc = i2c_mux_alloc(dev, sizeof(*arb));
>> +    if (!muxc)
>>           return -ENOMEM;
>> -    }
>> -    platform_set_drvdata(pdev, arb);
>> +    arb = i2c_mux_priv(muxc);
>>
>> +    platform_set_drvdata(pdev, muxc);
>>       /* Request GPIOs */
>>       ret = of_get_named_gpio_flags(np, "our-claim-gpio", 0, &gpio_flags);
>>       if (!gpio_is_valid(ret)) {
>> @@ -196,21 +195,21 @@ static int i2c_arbitrator_probe(struct platform_device *pdev)
>>           dev_err(dev, "Cannot parse i2c-parent\n");
>>           return -EINVAL;
>>       }
>> -    arb->parent = of_get_i2c_adapter_by_node(parent_np);
>> +    muxc->parent = of_find_i2c_adapter_by_node(parent_np);
>>       of_node_put(parent_np);
>> -    if (!arb->parent) {
>> +    if (!muxc->parent) {
>>           dev_err(dev, "Cannot find parent bus\n");
>>           return -EPROBE_DEFER;
>>       }
>>
>>       /* Actually add the mux adapter */
>> -    arb->child = i2c_add_mux_adapter(arb->parent, dev, arb, 0, 0, 0,
>> +    arb->child = i2c_add_mux_adapter(muxc, dev, arb, 0, 0, 0,
>>                        i2c_arbitrator_select,
>>                        i2c_arbitrator_deselect);
>>       if (!arb->child) {
>>           dev_err(dev, "Failed to add adapter\n");
>>           ret = -ENODEV;
>> -        i2c_put_adapter(arb->parent);
>> +        i2c_put_adapter(muxc->parent);
>>       }
>>
>>       return ret;
>> @@ -218,10 +217,11 @@ static int i2c_arbitrator_probe(struct platform_device *pdev)
>>
>>   static int i2c_arbitrator_remove(struct platform_device *pdev)
>>   {
>> -    struct i2c_arbitrator_data *arb = platform_get_drvdata(pdev);
>> +    struct i2c_mux_core *muxc = platform_get_drvdata(pdev);
>> +    struct i2c_arbitrator_data *arb = i2c_mux_priv(muxc);
>>
>>       i2c_del_mux_adapter(arb->child);
>> -    i2c_put_adapter(arb->parent);
>> +    i2c_put_adapter(muxc->parent);
>>
>>       return 0;
>>   }
>> diff --git a/drivers/i2c/muxes/i2c-mux-gpio.c b/drivers/i2c/muxes/i2c-mux-gpio.c
>> index b8e11c16d98c..ee43dd76a4d7 100644
>> --- a/drivers/i2c/muxes/i2c-mux-gpio.c
>> +++ b/drivers/i2c/muxes/i2c-mux-gpio.c
>> @@ -18,7 +18,6 @@
>>   #include <linux/of_gpio.h>
>>
>>   struct gpiomux {
>> -    struct i2c_adapter *parent;
>>       struct i2c_adapter **adap; /* child busses */
>>       struct i2c_mux_gpio_platform_data data;
>>       unsigned gpio_base;
>> @@ -136,19 +135,19 @@ static int i2c_mux_gpio_probe_dt(struct gpiomux *mux,
>>
>>   static int i2c_mux_gpio_probe(struct platform_device *pdev)
>>   {
>> +    struct i2c_mux_core *muxc;
>>       struct gpiomux *mux;
>>       struct i2c_adapter *parent;
>>       int (*deselect) (struct i2c_adapter *, void *, u32);
>>       unsigned initial_state, gpio_base;
>>       int i, ret;
>>
>> -    mux = devm_kzalloc(&pdev->dev, sizeof(*mux), GFP_KERNEL);
>> -    if (!mux) {
>> -        dev_err(&pdev->dev, "Cannot allocate gpiomux structure");
>> +    muxc = i2c_mux_alloc(&pdev->dev, sizeof(*mux));
>> +    if (!muxc)
>>           return -ENOMEM;
>> -    }
>> +    mux = i2c_mux_priv(muxc);
>>
>> -    platform_set_drvdata(pdev, mux);
>> +    platform_set_drvdata(pdev, muxc);
>>
>>       if (!dev_get_platdata(&pdev->dev)) {
>>           ret = i2c_mux_gpio_probe_dt(mux, pdev);
>> @@ -180,7 +179,7 @@ static int i2c_mux_gpio_probe(struct platform_device *pdev)
>>       if (!parent)
>>           return -EPROBE_DEFER;
>>
>> -    mux->parent = parent;
>> +    muxc->parent = parent;
>>       mux->gpio_base = gpio_base;
>>
>>       mux->adap = devm_kzalloc(&pdev->dev,
>> @@ -223,7 +222,7 @@ static int i2c_mux_gpio_probe(struct platform_device *pdev)
>>           u32 nr = mux->data.base_nr ? (mux->data.base_nr + i) : 0;
>>           unsigned int class = mux->data.classes ? mux->data.classes[i] : 0;
>>
>> -        mux->adap[i] = i2c_add_mux_adapter(parent, &pdev->dev, mux, nr,
>> +        mux->adap[i] = i2c_add_mux_adapter(muxc, &pdev->dev, mux, nr,
>>                              mux->data.values[i], class,
>>                              i2c_mux_gpio_select, deselect);
>>           if (!mux->adap[i]) {
>> @@ -253,7 +252,8 @@ alloc_failed:
>>
>>   static int i2c_mux_gpio_remove(struct platform_device *pdev)
>>   {
>> -    struct gpiomux *mux = platform_get_drvdata(pdev);
>> +    struct i2c_mux_core *muxc = platform_get_drvdata(pdev);
>> +    struct gpiomux *mux = i2c_mux_priv(muxc);
>>       int i;
>>
>>       for (i = 0; i < mux->data.n_values; i++)
>> @@ -262,7 +262,7 @@ static int i2c_mux_gpio_remove(struct platform_device *pdev)
>>       for (i = 0; i < mux->data.n_gpios; i++)
>>           gpio_free(mux->gpio_base + mux->data.gpios[i]);
>>
>> -    i2c_put_adapter(mux->parent);
>> +    i2c_put_adapter(muxc->parent);
>>
>>       return 0;
>>   }
>> diff --git a/drivers/i2c/muxes/i2c-mux-pca9541.c b/drivers/i2c/muxes/i2c-mux-pca9541.c
>> index d0ba424adebc..47ae2259d1ca 100644
>> --- a/drivers/i2c/muxes/i2c-mux-pca9541.c
>> +++ b/drivers/i2c/muxes/i2c-mux-pca9541.c
>> @@ -73,6 +73,7 @@
>>   #define SELECT_DELAY_LONG    1000
>>
>>   struct pca9541 {
>> +    struct i2c_client *client;
> 
> I fail to see where this is being used.
> 

Right, that was a bad split. It's not used until 2/8, I'll move this
and the one in pca954x for v3. I will also fix the compile problem with
inv_mpu_acpi.c for v3. But I'll wait a bit for more feedback first...

*snip*

Cheers,
Peter
--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux