phy: tusb1210: use bitmasks to set VENDOR_SPECIFIC2
authorLiam Beguin <lvb@xiphos.com>
Fri, 11 Dec 2020 19:12:41 +0000 (14:12 -0500)
committerVinod Koul <vkoul@kernel.org>
Fri, 12 Mar 2021 10:03:05 +0000 (15:33 +0530)
Start by reading the content of the VENDOR_SPECIFIC2 register and update
each bit field based on device properties when defined.

The use of bit masks prevents fields from overriding each other and
enables users to clear bits which are set by default, like datapolarity
in this instance.

Signed-off-by: Liam Beguin <lvb@xiphos.com>
Link: https://lore.kernel.org/r/20201211191241.21306-1-liambeguin@gmail.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/phy/ti/phy-tusb1210.c

index d8d0cc11d187e98c31e023ca60da8969bea9d98b..a63213f5972a7e591061bf6dce32d05644528ba2 100644 (file)
@@ -7,15 +7,16 @@
  * Author: Heikki Krogerus <heikki.krogerus@linux.intel.com>
  */
 #include <linux/module.h>
+#include <linux/bitfield.h>
 #include <linux/ulpi/driver.h>
 #include <linux/ulpi/regs.h>
 #include <linux/gpio/consumer.h>
 #include <linux/phy/ulpi_phy.h>
 
 #define TUSB1210_VENDOR_SPECIFIC2              0x80
-#define TUSB1210_VENDOR_SPECIFIC2_IHSTX_SHIFT  0
-#define TUSB1210_VENDOR_SPECIFIC2_ZHSDRV_SHIFT 4
-#define TUSB1210_VENDOR_SPECIFIC2_DP_SHIFT     6
+#define TUSB1210_VENDOR_SPECIFIC2_IHSTX_MASK   GENMASK(3, 0)
+#define TUSB1210_VENDOR_SPECIFIC2_ZHSDRV_MASK  GENMASK(5, 4)
+#define TUSB1210_VENDOR_SPECIFIC2_DP_MASK      BIT(6)
 
 struct tusb1210 {
        struct ulpi *ulpi;
@@ -118,22 +119,22 @@ static int tusb1210_probe(struct ulpi *ulpi)
         * diagram optimization and DP/DM swap.
         */
 
+       reg = ulpi_read(ulpi, TUSB1210_VENDOR_SPECIFIC2);
+
        /* High speed output drive strength configuration */
-       device_property_read_u8(&ulpi->dev, "ihstx", &val);
-       reg = val << TUSB1210_VENDOR_SPECIFIC2_IHSTX_SHIFT;
+       if (!device_property_read_u8(&ulpi->dev, "ihstx", &val))
+               u8p_replace_bits(&reg, val, (u8)TUSB1210_VENDOR_SPECIFIC2_IHSTX_MASK);
 
        /* High speed output impedance configuration */
-       device_property_read_u8(&ulpi->dev, "zhsdrv", &val);
-       reg |= val << TUSB1210_VENDOR_SPECIFIC2_ZHSDRV_SHIFT;
+       if (!device_property_read_u8(&ulpi->dev, "zhsdrv", &val))
+               u8p_replace_bits(&reg, val, (u8)TUSB1210_VENDOR_SPECIFIC2_ZHSDRV_MASK);
 
        /* DP/DM swap control */
-       device_property_read_u8(&ulpi->dev, "datapolarity", &val);
-       reg |= val << TUSB1210_VENDOR_SPECIFIC2_DP_SHIFT;
+       if (!device_property_read_u8(&ulpi->dev, "datapolarity", &val))
+               u8p_replace_bits(&reg, val, (u8)TUSB1210_VENDOR_SPECIFIC2_DP_MASK);
 
-       if (reg) {
-               ulpi_write(ulpi, TUSB1210_VENDOR_SPECIFIC2, reg);
-               tusb->vendor_specific2 = reg;
-       }
+       ulpi_write(ulpi, TUSB1210_VENDOR_SPECIFIC2, reg);
+       tusb->vendor_specific2 = reg;
 
        tusb->phy = ulpi_phy_create(ulpi, &phy_ops);
        if (IS_ERR(tusb->phy))