Merge remote-tracking branches 'spi/fix/atmel', 'spi/fix/bcm2835', 'spi/fix/doc'...
[firefly-linux-kernel-4.4.55.git] / drivers / i2c / muxes / i2c-mux-reg.c
index 57ec57e0da529f99aea074053ce042ead0a5abba..5fbd5bd0878f1f460a58556ba74f3b4354319389 100644 (file)
@@ -31,37 +31,34 @@ static int i2c_mux_reg_set(const struct regmux *mux, unsigned int chan_id)
        if (!mux->data.reg)
                return -EINVAL;
 
+       /*
+        * Write to the register, followed by a read to ensure the write is
+        * completed on a "posted" bus, for example PCI or write buffers.
+        * The endianness of reading doesn't matter and the return data
+        * is not used.
+        */
        switch (mux->data.reg_size) {
        case 4:
-               if (mux->data.little_endian) {
+               if (mux->data.little_endian)
                        iowrite32(chan_id, mux->data.reg);
-                       if (!mux->data.write_only)
-                               ioread32(mux->data.reg);
-               } else {
+               else
                        iowrite32be(chan_id, mux->data.reg);
-                       if (!mux->data.write_only)
-                               ioread32(mux->data.reg);
-               }
+               if (!mux->data.write_only)
+                       ioread32(mux->data.reg);
                break;
        case 2:
-               if (mux->data.little_endian) {
+               if (mux->data.little_endian)
                        iowrite16(chan_id, mux->data.reg);
-                       if (!mux->data.write_only)
-                               ioread16(mux->data.reg);
-               } else {
+               else
                        iowrite16be(chan_id, mux->data.reg);
-                       if (!mux->data.write_only)
-                               ioread16be(mux->data.reg);
-               }
+               if (!mux->data.write_only)
+                       ioread16(mux->data.reg);
                break;
        case 1:
                iowrite8(chan_id, mux->data.reg);
                if (!mux->data.write_only)
                        ioread8(mux->data.reg);
                break;
-       default:
-               pr_err("Invalid register size\n");
-               return -EINVAL;
        }
 
        return 0;
@@ -155,10 +152,6 @@ static int i2c_mux_reg_probe_dt(struct regmux *mux,
        /* map address from "reg" if exists */
        if (of_address_to_resource(np, 0, &res)) {
                mux->data.reg_size = resource_size(&res);
-               if (mux->data.reg_size > 4) {
-                       dev_err(&pdev->dev, "Invalid address size\n");
-                       return -EINVAL;
-               }
                mux->data.reg = devm_ioremap_resource(&pdev->dev, &res);
                if (IS_ERR(mux->data.reg))
                        return PTR_ERR(mux->data.reg);
@@ -167,7 +160,7 @@ static int i2c_mux_reg_probe_dt(struct regmux *mux,
        return 0;
 }
 #else
-static int i2c_mux_reg_probe_dt(struct gpiomux *mux,
+static int i2c_mux_reg_probe_dt(struct regmux *mux,
                                        struct platform_device *pdev)
 {
        return 0;
@@ -211,15 +204,17 @@ static int i2c_mux_reg_probe(struct platform_device *pdev)
                        "Register not set, using platform resource\n");
                res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
                mux->data.reg_size = resource_size(res);
-               if (mux->data.reg_size > 4) {
-                       dev_err(&pdev->dev, "Invalid resource size\n");
-                       return -EINVAL;
-               }
                mux->data.reg = devm_ioremap_resource(&pdev->dev, res);
                if (IS_ERR(mux->data.reg))
                        return PTR_ERR(mux->data.reg);
        }
 
+       if (mux->data.reg_size != 4 && mux->data.reg_size != 2 &&
+           mux->data.reg_size != 1) {
+               dev_err(&pdev->dev, "Invalid register size\n");
+               return -EINVAL;
+       }
+
        mux->adap = devm_kzalloc(&pdev->dev,
                                 sizeof(*mux->adap) * mux->data.n_values,
                                 GFP_KERNEL);