Lines Matching +full:attr +full:- +full:cnt +full:- +full:name
1 // SPDX-License-Identifier: GPL-2.0+
13 #include "bcm-phy-lib.h"
15 /* RDB per-port registers
60 #define BCM54140_RDB_MON_CTRL_SEL_RR 3 /* meassure all round-robin */
61 #define BCM54140_RDB_MON_CTRL_PWR_DOWN BIT(0) /* power-down monitor */
80 * T = 413.35 - (0.49055 * bits[9:0])
82 #define BCM54140_HWMON_TO_TEMP(v) (413350L - (v) * 491)
83 #define BCM54140_HWMON_FROM_TEMP(v) DIV_ROUND_CLOSEST_ULL(413350L - (v), 491)
148 u32 attr, int channel) in bcm54140_hwmon_is_visible() argument
152 switch (attr) { in bcm54140_hwmon_is_visible()
164 switch (attr) { in bcm54140_hwmon_is_visible()
183 struct bcm54140_priv *priv = phydev->priv; in bcm54140_hwmon_read_alarm()
186 mutex_lock(&priv->alarm_lock); in bcm54140_hwmon_read_alarm()
194 priv->alarm |= tmp; in bcm54140_hwmon_read_alarm()
196 *val = !!(priv->alarm & bit); in bcm54140_hwmon_read_alarm()
197 priv->alarm &= ~bit; in bcm54140_hwmon_read_alarm()
200 mutex_unlock(&priv->alarm_lock); in bcm54140_hwmon_read_alarm()
204 static int bcm54140_hwmon_read_temp(struct device *dev, u32 attr, long *val) in bcm54140_hwmon_read_temp() argument
210 switch (attr) { in bcm54140_hwmon_read_temp()
225 return -EOPNOTSUPP; in bcm54140_hwmon_read_temp()
237 static int bcm54140_hwmon_read_in(struct device *dev, u32 attr, in bcm54140_hwmon_read_in() argument
244 switch (attr) { in bcm54140_hwmon_read_in()
258 return -EOPNOTSUPP; in bcm54140_hwmon_read_in()
272 enum hwmon_sensor_types type, u32 attr, in bcm54140_hwmon_read() argument
277 return bcm54140_hwmon_read_temp(dev, attr, val); in bcm54140_hwmon_read()
279 return bcm54140_hwmon_read_in(dev, attr, channel, val); in bcm54140_hwmon_read()
281 return -EOPNOTSUPP; in bcm54140_hwmon_read()
291 enum hwmon_sensor_types type, u32 attr, in bcm54140_hwmon_read_string() argument
296 switch (attr) { in bcm54140_hwmon_read_string()
301 return -EOPNOTSUPP; in bcm54140_hwmon_read_string()
304 return -EOPNOTSUPP; in bcm54140_hwmon_read_string()
308 static int bcm54140_hwmon_write_temp(struct device *dev, u32 attr, in bcm54140_hwmon_write_temp() argument
318 switch (attr) { in bcm54140_hwmon_write_temp()
326 return -EOPNOTSUPP; in bcm54140_hwmon_write_temp()
333 static int bcm54140_hwmon_write_in(struct device *dev, u32 attr, in bcm54140_hwmon_write_in() argument
342 switch (attr) { in bcm54140_hwmon_write_in()
350 return -EOPNOTSUPP; in bcm54140_hwmon_write_in()
358 enum hwmon_sensor_types type, u32 attr, in bcm54140_hwmon_write() argument
363 return bcm54140_hwmon_write_temp(dev, attr, channel, val); in bcm54140_hwmon_write()
365 return bcm54140_hwmon_write_in(dev, attr, channel, val); in bcm54140_hwmon_write()
367 return -EOPNOTSUPP; in bcm54140_hwmon_write()
402 /* select round-robin */ in bcm54140_enable_monitoring()
407 /* remove power-down bit */ in bcm54140_enable_monitoring()
423 hwmon = devm_hwmon_device_register_with_info(&phydev->mdio.dev, in bcm54140_probe_once()
506 struct bcm54140_priv *priv = phydev->priv; in bcm54140_get_base_addr_and_port()
507 struct mii_bus *bus = phydev->mdio.bus; in bcm54140_get_base_addr_and_port()
513 min_addr = phydev->mdio.addr; in bcm54140_get_base_addr_and_port()
514 max_addr = phydev->mdio.addr; in bcm54140_get_base_addr_and_port()
515 addr = phydev->mdio.addr; in bcm54140_get_base_addr_and_port()
535 addr--; in bcm54140_get_base_addr_and_port()
539 addr = phydev->mdio.addr; in bcm54140_get_base_addr_and_port()
555 if ((phy_id & phydev->drv->phy_id_mask) != in bcm54140_get_base_addr_and_port()
556 (phydev->drv->phy_id & phydev->drv->phy_id_mask)) { in bcm54140_get_base_addr_and_port()
557 addr = phydev->mdio.addr; in bcm54140_get_base_addr_and_port()
566 if ((max_addr - min_addr + 1) % 4) { in bcm54140_get_base_addr_and_port()
567 dev_err(&phydev->mdio.dev, in bcm54140_get_base_addr_and_port()
570 return -EINVAL; in bcm54140_get_base_addr_and_port()
573 priv->port = (phydev->mdio.addr - min_addr) % 4; in bcm54140_get_base_addr_and_port()
574 priv->base_addr = phydev->mdio.addr - priv->port; in bcm54140_get_base_addr_and_port()
584 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in bcm54140_probe()
586 return -ENOMEM; in bcm54140_probe()
588 phydev->priv = priv; in bcm54140_probe()
594 devm_phy_package_join(&phydev->mdio.dev, phydev, priv->base_addr, 0); in bcm54140_probe()
597 mutex_init(&priv->alarm_lock); in bcm54140_probe()
607 priv->port, priv->base_addr); in bcm54140_probe()
618 if (BCM54140_PHY_ID_REV(phydev->phy_id) == BCM54140_REV_B0) { in bcm54140_config_init()
687 struct bcm54140_priv *priv = phydev->priv; in bcm54140_config_intr()
694 if (priv->port >= ARRAY_SIZE(port_to_imr_bit)) in bcm54140_config_intr()
695 return -EINVAL; in bcm54140_config_intr()
701 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in bcm54140_config_intr()
706 reg &= ~port_to_imr_bit[priv->port]; in bcm54140_config_intr()
709 reg |= port_to_imr_bit[priv->port]; in bcm54140_config_intr()
745 static int bcm54140_set_downshift(struct phy_device *phydev, u8 cnt) in bcm54140_set_downshift() argument
750 if (cnt > BCM54140_MAX_DOWNSHIFT && cnt != DOWNSHIFT_DEV_DEFAULT_COUNT) in bcm54140_set_downshift()
751 return -EINVAL; in bcm54140_set_downshift()
753 if (!cnt) in bcm54140_set_downshift()
757 if (cnt == DOWNSHIFT_DEV_DEFAULT_COUNT) in bcm54140_set_downshift()
758 cnt = BCM54140_DEFAULT_DOWNSHIFT; in bcm54140_set_downshift()
760 if (cnt == 1) { in bcm54140_set_downshift()
766 set = FIELD_PREP(BCM54140_RDB_SPARE2_WS_RTRY_LIMIT, cnt - 2); in bcm54140_set_downshift()
832 return -EINVAL; in bcm54140_set_edpd()
841 switch (tuna->id) { in bcm54140_get_tunable()
847 return -EOPNOTSUPP; in bcm54140_get_tunable()
854 switch (tuna->id) { in bcm54140_set_tunable()
860 return -EOPNOTSUPP; in bcm54140_set_tunable()
868 .name = "Broadcom BCM54140",