phy: tusb1210: use bitmasks to set VENDOR_SPECIFIC2
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>
This commit is contained in:
parent
015acd5d3a
commit
eb445a15fa
|
@ -7,15 +7,16 @@
|
||||||
* Author: Heikki Krogerus <heikki.krogerus@linux.intel.com>
|
* Author: Heikki Krogerus <heikki.krogerus@linux.intel.com>
|
||||||
*/
|
*/
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
#include <linux/bitfield.h>
|
||||||
#include <linux/ulpi/driver.h>
|
#include <linux/ulpi/driver.h>
|
||||||
#include <linux/ulpi/regs.h>
|
#include <linux/ulpi/regs.h>
|
||||||
#include <linux/gpio/consumer.h>
|
#include <linux/gpio/consumer.h>
|
||||||
#include <linux/phy/ulpi_phy.h>
|
#include <linux/phy/ulpi_phy.h>
|
||||||
|
|
||||||
#define TUSB1210_VENDOR_SPECIFIC2 0x80
|
#define TUSB1210_VENDOR_SPECIFIC2 0x80
|
||||||
#define TUSB1210_VENDOR_SPECIFIC2_IHSTX_SHIFT 0
|
#define TUSB1210_VENDOR_SPECIFIC2_IHSTX_MASK GENMASK(3, 0)
|
||||||
#define TUSB1210_VENDOR_SPECIFIC2_ZHSDRV_SHIFT 4
|
#define TUSB1210_VENDOR_SPECIFIC2_ZHSDRV_MASK GENMASK(5, 4)
|
||||||
#define TUSB1210_VENDOR_SPECIFIC2_DP_SHIFT 6
|
#define TUSB1210_VENDOR_SPECIFIC2_DP_MASK BIT(6)
|
||||||
|
|
||||||
struct tusb1210 {
|
struct tusb1210 {
|
||||||
struct ulpi *ulpi;
|
struct ulpi *ulpi;
|
||||||
|
@ -118,22 +119,22 @@ static int tusb1210_probe(struct ulpi *ulpi)
|
||||||
* diagram optimization and DP/DM swap.
|
* diagram optimization and DP/DM swap.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
reg = ulpi_read(ulpi, TUSB1210_VENDOR_SPECIFIC2);
|
||||||
|
|
||||||
/* High speed output drive strength configuration */
|
/* High speed output drive strength configuration */
|
||||||
device_property_read_u8(&ulpi->dev, "ihstx", &val);
|
if (!device_property_read_u8(&ulpi->dev, "ihstx", &val))
|
||||||
reg = val << TUSB1210_VENDOR_SPECIFIC2_IHSTX_SHIFT;
|
u8p_replace_bits(®, val, (u8)TUSB1210_VENDOR_SPECIFIC2_IHSTX_MASK);
|
||||||
|
|
||||||
/* High speed output impedance configuration */
|
/* High speed output impedance configuration */
|
||||||
device_property_read_u8(&ulpi->dev, "zhsdrv", &val);
|
if (!device_property_read_u8(&ulpi->dev, "zhsdrv", &val))
|
||||||
reg |= val << TUSB1210_VENDOR_SPECIFIC2_ZHSDRV_SHIFT;
|
u8p_replace_bits(®, val, (u8)TUSB1210_VENDOR_SPECIFIC2_ZHSDRV_MASK);
|
||||||
|
|
||||||
/* DP/DM swap control */
|
/* DP/DM swap control */
|
||||||
device_property_read_u8(&ulpi->dev, "datapolarity", &val);
|
if (!device_property_read_u8(&ulpi->dev, "datapolarity", &val))
|
||||||
reg |= val << TUSB1210_VENDOR_SPECIFIC2_DP_SHIFT;
|
u8p_replace_bits(®, val, (u8)TUSB1210_VENDOR_SPECIFIC2_DP_MASK);
|
||||||
|
|
||||||
if (reg) {
|
ulpi_write(ulpi, TUSB1210_VENDOR_SPECIFIC2, reg);
|
||||||
ulpi_write(ulpi, TUSB1210_VENDOR_SPECIFIC2, reg);
|
tusb->vendor_specific2 = reg;
|
||||||
tusb->vendor_specific2 = reg;
|
|
||||||
}
|
|
||||||
|
|
||||||
tusb->phy = ulpi_phy_create(ulpi, &phy_ops);
|
tusb->phy = ulpi_phy_create(ulpi, &phy_ops);
|
||||||
if (IS_ERR(tusb->phy))
|
if (IS_ERR(tusb->phy))
|
||||||
|
|
Loading…
Reference in New Issue