173970055SRussell King #include <linux/delay.h> 254a2fc62SFlorian Fainelli #include <linux/gpio/consumer.h> 373970055SRussell King #include <linux/i2c.h> 473970055SRussell King #include <linux/interrupt.h> 573970055SRussell King #include <linux/jiffies.h> 673970055SRussell King #include <linux/module.h> 773970055SRussell King #include <linux/mutex.h> 873970055SRussell King #include <linux/of.h> 973970055SRussell King #include <linux/phy.h> 1073970055SRussell King #include <linux/platform_device.h> 1173970055SRussell King #include <linux/rtnetlink.h> 1273970055SRussell King #include <linux/slab.h> 1373970055SRussell King #include <linux/workqueue.h> 1473970055SRussell King 1573970055SRussell King #include "mdio-i2c.h" 1673970055SRussell King #include "sfp.h" 1773970055SRussell King #include "swphy.h" 1873970055SRussell King 1973970055SRussell King enum { 2073970055SRussell King GPIO_MODDEF0, 2173970055SRussell King GPIO_LOS, 2273970055SRussell King GPIO_TX_FAULT, 2373970055SRussell King GPIO_TX_DISABLE, 2473970055SRussell King GPIO_RATE_SELECT, 2573970055SRussell King GPIO_MAX, 2673970055SRussell King 2773970055SRussell King SFP_F_PRESENT = BIT(GPIO_MODDEF0), 2873970055SRussell King SFP_F_LOS = BIT(GPIO_LOS), 2973970055SRussell King SFP_F_TX_FAULT = BIT(GPIO_TX_FAULT), 3073970055SRussell King SFP_F_TX_DISABLE = BIT(GPIO_TX_DISABLE), 3173970055SRussell King SFP_F_RATE_SELECT = BIT(GPIO_RATE_SELECT), 3273970055SRussell King 3373970055SRussell King SFP_E_INSERT = 0, 3473970055SRussell King SFP_E_REMOVE, 3573970055SRussell King SFP_E_DEV_DOWN, 3673970055SRussell King SFP_E_DEV_UP, 3773970055SRussell King SFP_E_TX_FAULT, 3873970055SRussell King SFP_E_TX_CLEAR, 3973970055SRussell King SFP_E_LOS_HIGH, 4073970055SRussell King SFP_E_LOS_LOW, 4173970055SRussell King SFP_E_TIMEOUT, 4273970055SRussell King 4373970055SRussell King SFP_MOD_EMPTY = 0, 4473970055SRussell King SFP_MOD_PROBE, 4573970055SRussell King SFP_MOD_PRESENT, 4673970055SRussell King SFP_MOD_ERROR, 4773970055SRussell King 4873970055SRussell King SFP_DEV_DOWN = 0, 4973970055SRussell King SFP_DEV_UP, 5073970055SRussell King 5173970055SRussell King SFP_S_DOWN = 0, 5273970055SRussell King SFP_S_INIT, 5373970055SRussell King SFP_S_WAIT_LOS, 5473970055SRussell King SFP_S_LINK_UP, 5573970055SRussell King SFP_S_TX_FAULT, 5673970055SRussell King SFP_S_REINIT, 5773970055SRussell King SFP_S_TX_DISABLE, 5873970055SRussell King }; 5973970055SRussell King 6073970055SRussell King static const char *gpio_of_names[] = { 6125ee0793SBaruch Siach "mod-def0", 6273970055SRussell King "los", 6373970055SRussell King "tx-fault", 6473970055SRussell King "tx-disable", 6525ee0793SBaruch Siach "rate-select0", 6673970055SRussell King }; 6773970055SRussell King 6873970055SRussell King static const enum gpiod_flags gpio_flags[] = { 6973970055SRussell King GPIOD_IN, 7073970055SRussell King GPIOD_IN, 7173970055SRussell King GPIOD_IN, 7273970055SRussell King GPIOD_ASIS, 7373970055SRussell King GPIOD_ASIS, 7473970055SRussell King }; 7573970055SRussell King 7673970055SRussell King #define T_INIT_JIFFIES msecs_to_jiffies(300) 7773970055SRussell King #define T_RESET_US 10 7873970055SRussell King #define T_FAULT_RECOVER msecs_to_jiffies(1000) 7973970055SRussell King 8073970055SRussell King /* SFP module presence detection is poor: the three MOD DEF signals are 8173970055SRussell King * the same length on the PCB, which means it's possible for MOD DEF 0 to 8273970055SRussell King * connect before the I2C bus on MOD DEF 1/2. 8373970055SRussell King * 8473970055SRussell King * The SFP MSA specifies 300ms as t_init (the time taken for TX_FAULT to 8573970055SRussell King * be deasserted) but makes no mention of the earliest time before we can 8673970055SRussell King * access the I2C EEPROM. However, Avago modules require 300ms. 8773970055SRussell King */ 8873970055SRussell King #define T_PROBE_INIT msecs_to_jiffies(300) 8973970055SRussell King #define T_PROBE_RETRY msecs_to_jiffies(100) 9073970055SRussell King 91516b29edSFlorian Fainelli /* SFP modules appear to always have their PHY configured for bus address 9273970055SRussell King * 0x56 (which with mdio-i2c, translates to a PHY address of 22). 9373970055SRussell King */ 9473970055SRussell King #define SFP_PHY_ADDR 22 9573970055SRussell King 96516b29edSFlorian Fainelli /* Give this long for the PHY to reset. */ 9773970055SRussell King #define T_PHY_RESET_MS 50 9873970055SRussell King 9973970055SRussell King static DEFINE_MUTEX(sfp_mutex); 10073970055SRussell King 101259c8618SRussell King struct sff_data { 102259c8618SRussell King unsigned int gpios; 103259c8618SRussell King bool (*module_supported)(const struct sfp_eeprom_id *id); 104259c8618SRussell King }; 105259c8618SRussell King 10673970055SRussell King struct sfp { 10773970055SRussell King struct device *dev; 10873970055SRussell King struct i2c_adapter *i2c; 10973970055SRussell King struct mii_bus *i2c_mii; 11073970055SRussell King struct sfp_bus *sfp_bus; 11173970055SRussell King struct phy_device *mod_phy; 112259c8618SRussell King const struct sff_data *type; 11373970055SRussell King 11473970055SRussell King unsigned int (*get_state)(struct sfp *); 11573970055SRussell King void (*set_state)(struct sfp *, unsigned int); 11673970055SRussell King int (*read)(struct sfp *, bool, u8, void *, size_t); 11773970055SRussell King 11873970055SRussell King struct gpio_desc *gpio[GPIO_MAX]; 11973970055SRussell King 12073970055SRussell King unsigned int state; 12173970055SRussell King struct delayed_work poll; 12273970055SRussell King struct delayed_work timeout; 12373970055SRussell King struct mutex sm_mutex; 12473970055SRussell King unsigned char sm_mod_state; 12573970055SRussell King unsigned char sm_dev_state; 12673970055SRussell King unsigned short sm_state; 12773970055SRussell King unsigned int sm_retries; 12873970055SRussell King 12973970055SRussell King struct sfp_eeprom_id id; 13073970055SRussell King }; 13173970055SRussell King 132259c8618SRussell King static bool sff_module_supported(const struct sfp_eeprom_id *id) 133259c8618SRussell King { 134259c8618SRussell King return id->base.phys_id == SFP_PHYS_ID_SFF && 135259c8618SRussell King id->base.phys_ext_id == SFP_PHYS_EXT_ID_SFP; 136259c8618SRussell King } 137259c8618SRussell King 138259c8618SRussell King static const struct sff_data sff_data = { 139259c8618SRussell King .gpios = SFP_F_LOS | SFP_F_TX_FAULT | SFP_F_TX_DISABLE, 140259c8618SRussell King .module_supported = sff_module_supported, 141259c8618SRussell King }; 142259c8618SRussell King 143259c8618SRussell King static bool sfp_module_supported(const struct sfp_eeprom_id *id) 144259c8618SRussell King { 145259c8618SRussell King return id->base.phys_id == SFP_PHYS_ID_SFP && 146259c8618SRussell King id->base.phys_ext_id == SFP_PHYS_EXT_ID_SFP; 147259c8618SRussell King } 148259c8618SRussell King 149259c8618SRussell King static const struct sff_data sfp_data = { 150259c8618SRussell King .gpios = SFP_F_PRESENT | SFP_F_LOS | SFP_F_TX_FAULT | 151259c8618SRussell King SFP_F_TX_DISABLE | SFP_F_RATE_SELECT, 152259c8618SRussell King .module_supported = sfp_module_supported, 153259c8618SRussell King }; 154259c8618SRussell King 155259c8618SRussell King static const struct of_device_id sfp_of_match[] = { 156259c8618SRussell King { .compatible = "sff,sff", .data = &sff_data, }, 157259c8618SRussell King { .compatible = "sff,sfp", .data = &sfp_data, }, 158259c8618SRussell King { }, 159259c8618SRussell King }; 160259c8618SRussell King MODULE_DEVICE_TABLE(of, sfp_of_match); 161259c8618SRussell King 16273970055SRussell King static unsigned long poll_jiffies; 16373970055SRussell King 16473970055SRussell King static unsigned int sfp_gpio_get_state(struct sfp *sfp) 16573970055SRussell King { 16673970055SRussell King unsigned int i, state, v; 16773970055SRussell King 16873970055SRussell King for (i = state = 0; i < GPIO_MAX; i++) { 16973970055SRussell King if (gpio_flags[i] != GPIOD_IN || !sfp->gpio[i]) 17073970055SRussell King continue; 17173970055SRussell King 17273970055SRussell King v = gpiod_get_value_cansleep(sfp->gpio[i]); 17373970055SRussell King if (v) 17473970055SRussell King state |= BIT(i); 17573970055SRussell King } 17673970055SRussell King 17773970055SRussell King return state; 17873970055SRussell King } 17973970055SRussell King 180259c8618SRussell King static unsigned int sff_gpio_get_state(struct sfp *sfp) 181259c8618SRussell King { 182259c8618SRussell King return sfp_gpio_get_state(sfp) | SFP_F_PRESENT; 183259c8618SRussell King } 184259c8618SRussell King 18573970055SRussell King static void sfp_gpio_set_state(struct sfp *sfp, unsigned int state) 18673970055SRussell King { 18773970055SRussell King if (state & SFP_F_PRESENT) { 18873970055SRussell King /* If the module is present, drive the signals */ 18973970055SRussell King if (sfp->gpio[GPIO_TX_DISABLE]) 19073970055SRussell King gpiod_direction_output(sfp->gpio[GPIO_TX_DISABLE], 19173970055SRussell King state & SFP_F_TX_DISABLE); 19273970055SRussell King if (state & SFP_F_RATE_SELECT) 19373970055SRussell King gpiod_direction_output(sfp->gpio[GPIO_RATE_SELECT], 19473970055SRussell King state & SFP_F_RATE_SELECT); 19573970055SRussell King } else { 19673970055SRussell King /* Otherwise, let them float to the pull-ups */ 19773970055SRussell King if (sfp->gpio[GPIO_TX_DISABLE]) 19873970055SRussell King gpiod_direction_input(sfp->gpio[GPIO_TX_DISABLE]); 19973970055SRussell King if (state & SFP_F_RATE_SELECT) 20073970055SRussell King gpiod_direction_input(sfp->gpio[GPIO_RATE_SELECT]); 20173970055SRussell King } 20273970055SRussell King } 20373970055SRussell King 20473970055SRussell King static int sfp__i2c_read(struct i2c_adapter *i2c, u8 bus_addr, u8 dev_addr, 20573970055SRussell King void *buf, size_t len) 20673970055SRussell King { 20773970055SRussell King struct i2c_msg msgs[2]; 20873970055SRussell King int ret; 20973970055SRussell King 21073970055SRussell King msgs[0].addr = bus_addr; 21173970055SRussell King msgs[0].flags = 0; 21273970055SRussell King msgs[0].len = 1; 21373970055SRussell King msgs[0].buf = &dev_addr; 21473970055SRussell King msgs[1].addr = bus_addr; 21573970055SRussell King msgs[1].flags = I2C_M_RD; 21673970055SRussell King msgs[1].len = len; 21773970055SRussell King msgs[1].buf = buf; 21873970055SRussell King 21973970055SRussell King ret = i2c_transfer(i2c, msgs, ARRAY_SIZE(msgs)); 22073970055SRussell King if (ret < 0) 22173970055SRussell King return ret; 22273970055SRussell King 22373970055SRussell King return ret == ARRAY_SIZE(msgs) ? len : 0; 22473970055SRussell King } 22573970055SRussell King 22673970055SRussell King static int sfp_i2c_read(struct sfp *sfp, bool a2, u8 addr, void *buf, 22773970055SRussell King size_t len) 22873970055SRussell King { 22973970055SRussell King return sfp__i2c_read(sfp->i2c, a2 ? 0x51 : 0x50, addr, buf, len); 23073970055SRussell King } 23173970055SRussell King 23273970055SRussell King static int sfp_i2c_configure(struct sfp *sfp, struct i2c_adapter *i2c) 23373970055SRussell King { 23473970055SRussell King struct mii_bus *i2c_mii; 23573970055SRussell King int ret; 23673970055SRussell King 23773970055SRussell King if (!i2c_check_functionality(i2c, I2C_FUNC_I2C)) 23873970055SRussell King return -EINVAL; 23973970055SRussell King 24073970055SRussell King sfp->i2c = i2c; 24173970055SRussell King sfp->read = sfp_i2c_read; 24273970055SRussell King 24373970055SRussell King i2c_mii = mdio_i2c_alloc(sfp->dev, i2c); 24473970055SRussell King if (IS_ERR(i2c_mii)) 24573970055SRussell King return PTR_ERR(i2c_mii); 24673970055SRussell King 24773970055SRussell King i2c_mii->name = "SFP I2C Bus"; 24873970055SRussell King i2c_mii->phy_mask = ~0; 24973970055SRussell King 25073970055SRussell King ret = mdiobus_register(i2c_mii); 25173970055SRussell King if (ret < 0) { 25273970055SRussell King mdiobus_free(i2c_mii); 25373970055SRussell King return ret; 25473970055SRussell King } 25573970055SRussell King 25673970055SRussell King sfp->i2c_mii = i2c_mii; 25773970055SRussell King 25873970055SRussell King return 0; 25973970055SRussell King } 26073970055SRussell King 26173970055SRussell King /* Interface */ 26273970055SRussell King static unsigned int sfp_get_state(struct sfp *sfp) 26373970055SRussell King { 26473970055SRussell King return sfp->get_state(sfp); 26573970055SRussell King } 26673970055SRussell King 26773970055SRussell King static void sfp_set_state(struct sfp *sfp, unsigned int state) 26873970055SRussell King { 26973970055SRussell King sfp->set_state(sfp, state); 27073970055SRussell King } 27173970055SRussell King 27273970055SRussell King static int sfp_read(struct sfp *sfp, bool a2, u8 addr, void *buf, size_t len) 27373970055SRussell King { 27473970055SRussell King return sfp->read(sfp, a2, addr, buf, len); 27573970055SRussell King } 27673970055SRussell King 27773970055SRussell King static unsigned int sfp_check(void *buf, size_t len) 27873970055SRussell King { 27973970055SRussell King u8 *p, check; 28073970055SRussell King 28173970055SRussell King for (p = buf, check = 0; len; p++, len--) 28273970055SRussell King check += *p; 28373970055SRussell King 28473970055SRussell King return check; 28573970055SRussell King } 28673970055SRussell King 28773970055SRussell King /* Helpers */ 28873970055SRussell King static void sfp_module_tx_disable(struct sfp *sfp) 28973970055SRussell King { 29073970055SRussell King dev_dbg(sfp->dev, "tx disable %u -> %u\n", 29173970055SRussell King sfp->state & SFP_F_TX_DISABLE ? 1 : 0, 1); 29273970055SRussell King sfp->state |= SFP_F_TX_DISABLE; 29373970055SRussell King sfp_set_state(sfp, sfp->state); 29473970055SRussell King } 29573970055SRussell King 29673970055SRussell King static void sfp_module_tx_enable(struct sfp *sfp) 29773970055SRussell King { 29873970055SRussell King dev_dbg(sfp->dev, "tx disable %u -> %u\n", 29973970055SRussell King sfp->state & SFP_F_TX_DISABLE ? 1 : 0, 0); 30073970055SRussell King sfp->state &= ~SFP_F_TX_DISABLE; 30173970055SRussell King sfp_set_state(sfp, sfp->state); 30273970055SRussell King } 30373970055SRussell King 30473970055SRussell King static void sfp_module_tx_fault_reset(struct sfp *sfp) 30573970055SRussell King { 30673970055SRussell King unsigned int state = sfp->state; 30773970055SRussell King 30873970055SRussell King if (state & SFP_F_TX_DISABLE) 30973970055SRussell King return; 31073970055SRussell King 31173970055SRussell King sfp_set_state(sfp, state | SFP_F_TX_DISABLE); 31273970055SRussell King 31373970055SRussell King udelay(T_RESET_US); 31473970055SRussell King 31573970055SRussell King sfp_set_state(sfp, state); 31673970055SRussell King } 31773970055SRussell King 31873970055SRussell King /* SFP state machine */ 31973970055SRussell King static void sfp_sm_set_timer(struct sfp *sfp, unsigned int timeout) 32073970055SRussell King { 32173970055SRussell King if (timeout) 32273970055SRussell King mod_delayed_work(system_power_efficient_wq, &sfp->timeout, 32373970055SRussell King timeout); 32473970055SRussell King else 32573970055SRussell King cancel_delayed_work(&sfp->timeout); 32673970055SRussell King } 32773970055SRussell King 32873970055SRussell King static void sfp_sm_next(struct sfp *sfp, unsigned int state, 32973970055SRussell King unsigned int timeout) 33073970055SRussell King { 33173970055SRussell King sfp->sm_state = state; 33273970055SRussell King sfp_sm_set_timer(sfp, timeout); 33373970055SRussell King } 33473970055SRussell King 335516b29edSFlorian Fainelli static void sfp_sm_ins_next(struct sfp *sfp, unsigned int state, 336516b29edSFlorian Fainelli unsigned int timeout) 33773970055SRussell King { 33873970055SRussell King sfp->sm_mod_state = state; 33973970055SRussell King sfp_sm_set_timer(sfp, timeout); 34073970055SRussell King } 34173970055SRussell King 34273970055SRussell King static void sfp_sm_phy_detach(struct sfp *sfp) 34373970055SRussell King { 34473970055SRussell King phy_stop(sfp->mod_phy); 34573970055SRussell King sfp_remove_phy(sfp->sfp_bus); 34673970055SRussell King phy_device_remove(sfp->mod_phy); 34773970055SRussell King phy_device_free(sfp->mod_phy); 34873970055SRussell King sfp->mod_phy = NULL; 34973970055SRussell King } 35073970055SRussell King 35173970055SRussell King static void sfp_sm_probe_phy(struct sfp *sfp) 35273970055SRussell King { 35373970055SRussell King struct phy_device *phy; 35473970055SRussell King int err; 35573970055SRussell King 35673970055SRussell King msleep(T_PHY_RESET_MS); 35773970055SRussell King 35873970055SRussell King phy = mdiobus_scan(sfp->i2c_mii, SFP_PHY_ADDR); 35920b56ed9SRussell King if (phy == ERR_PTR(-ENODEV)) { 36020b56ed9SRussell King dev_info(sfp->dev, "no PHY detected\n"); 36173970055SRussell King return; 36273970055SRussell King } 36320b56ed9SRussell King if (IS_ERR(phy)) { 36420b56ed9SRussell King dev_err(sfp->dev, "mdiobus scan returned %ld\n", PTR_ERR(phy)); 36573970055SRussell King return; 36673970055SRussell King } 36773970055SRussell King 36873970055SRussell King err = sfp_add_phy(sfp->sfp_bus, phy); 36973970055SRussell King if (err) { 37073970055SRussell King phy_device_remove(phy); 37173970055SRussell King phy_device_free(phy); 37273970055SRussell King dev_err(sfp->dev, "sfp_add_phy failed: %d\n", err); 37373970055SRussell King return; 37473970055SRussell King } 37573970055SRussell King 37673970055SRussell King sfp->mod_phy = phy; 37773970055SRussell King phy_start(phy); 37873970055SRussell King } 37973970055SRussell King 38073970055SRussell King static void sfp_sm_link_up(struct sfp *sfp) 38173970055SRussell King { 38273970055SRussell King sfp_link_up(sfp->sfp_bus); 38373970055SRussell King sfp_sm_next(sfp, SFP_S_LINK_UP, 0); 38473970055SRussell King } 38573970055SRussell King 38673970055SRussell King static void sfp_sm_link_down(struct sfp *sfp) 38773970055SRussell King { 38873970055SRussell King sfp_link_down(sfp->sfp_bus); 38973970055SRussell King } 39073970055SRussell King 39173970055SRussell King static void sfp_sm_link_check_los(struct sfp *sfp) 39273970055SRussell King { 39373970055SRussell King unsigned int los = sfp->state & SFP_F_LOS; 39473970055SRussell King 395710dfbb0SRussell King /* If neither SFP_OPTIONS_LOS_INVERTED nor SFP_OPTIONS_LOS_NORMAL 396710dfbb0SRussell King * are set, we assume that no LOS signal is available. 39773970055SRussell King */ 398acf1c02fSRussell King if (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_INVERTED)) 39973970055SRussell King los ^= SFP_F_LOS; 400710dfbb0SRussell King else if (!(sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_NORMAL))) 401710dfbb0SRussell King los = 0; 40273970055SRussell King 40373970055SRussell King if (los) 40473970055SRussell King sfp_sm_next(sfp, SFP_S_WAIT_LOS, 0); 40573970055SRussell King else 40673970055SRussell King sfp_sm_link_up(sfp); 40773970055SRussell King } 40873970055SRussell King 409710dfbb0SRussell King static bool sfp_los_event_active(struct sfp *sfp, unsigned int event) 410710dfbb0SRussell King { 411710dfbb0SRussell King return (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_INVERTED) && 412710dfbb0SRussell King event == SFP_E_LOS_LOW) || 413710dfbb0SRussell King (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_NORMAL) && 414710dfbb0SRussell King event == SFP_E_LOS_HIGH); 415710dfbb0SRussell King } 416710dfbb0SRussell King 417710dfbb0SRussell King static bool sfp_los_event_inactive(struct sfp *sfp, unsigned int event) 418710dfbb0SRussell King { 419710dfbb0SRussell King return (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_INVERTED) && 420710dfbb0SRussell King event == SFP_E_LOS_HIGH) || 421710dfbb0SRussell King (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_NORMAL) && 422710dfbb0SRussell King event == SFP_E_LOS_LOW); 423710dfbb0SRussell King } 424710dfbb0SRussell King 42573970055SRussell King static void sfp_sm_fault(struct sfp *sfp, bool warn) 42673970055SRussell King { 42773970055SRussell King if (sfp->sm_retries && !--sfp->sm_retries) { 428516b29edSFlorian Fainelli dev_err(sfp->dev, 429516b29edSFlorian Fainelli "module persistently indicates fault, disabling\n"); 43073970055SRussell King sfp_sm_next(sfp, SFP_S_TX_DISABLE, 0); 43173970055SRussell King } else { 43273970055SRussell King if (warn) 43373970055SRussell King dev_err(sfp->dev, "module transmit fault indicated\n"); 43473970055SRussell King 43573970055SRussell King sfp_sm_next(sfp, SFP_S_TX_FAULT, T_FAULT_RECOVER); 43673970055SRussell King } 43773970055SRussell King } 43873970055SRussell King 43973970055SRussell King static void sfp_sm_mod_init(struct sfp *sfp) 44073970055SRussell King { 44173970055SRussell King sfp_module_tx_enable(sfp); 44273970055SRussell King 44373970055SRussell King /* Wait t_init before indicating that the link is up, provided the 44473970055SRussell King * current state indicates no TX_FAULT. If TX_FAULT clears before 44573970055SRussell King * this time, that's fine too. 44673970055SRussell King */ 44773970055SRussell King sfp_sm_next(sfp, SFP_S_INIT, T_INIT_JIFFIES); 44873970055SRussell King sfp->sm_retries = 5; 44973970055SRussell King 45073970055SRussell King /* Setting the serdes link mode is guesswork: there's no 45173970055SRussell King * field in the EEPROM which indicates what mode should 45273970055SRussell King * be used. 45373970055SRussell King * 45473970055SRussell King * If it's a gigabit-only fiber module, it probably does 45573970055SRussell King * not have a PHY, so switch to 802.3z negotiation mode. 45673970055SRussell King * Otherwise, switch to SGMII mode (which is required to 45773970055SRussell King * support non-gigabit speeds) and probe for a PHY. 45873970055SRussell King */ 45973970055SRussell King if (sfp->id.base.e1000_base_t || 46073970055SRussell King sfp->id.base.e100_base_lx || 46173970055SRussell King sfp->id.base.e100_base_fx) 46273970055SRussell King sfp_sm_probe_phy(sfp); 46373970055SRussell King } 46473970055SRussell King 46573970055SRussell King static int sfp_sm_mod_probe(struct sfp *sfp) 46673970055SRussell King { 46773970055SRussell King /* SFP module inserted - read I2C data */ 46873970055SRussell King struct sfp_eeprom_id id; 46973970055SRussell King char vendor[17]; 47073970055SRussell King char part[17]; 47173970055SRussell King char sn[17]; 47273970055SRussell King char date[9]; 47373970055SRussell King char rev[5]; 47473970055SRussell King u8 check; 47573970055SRussell King int err; 47673970055SRussell King 47773970055SRussell King err = sfp_read(sfp, false, 0, &id, sizeof(id)); 47873970055SRussell King if (err < 0) { 47973970055SRussell King dev_err(sfp->dev, "failed to read EEPROM: %d\n", err); 48073970055SRussell King return -EAGAIN; 48173970055SRussell King } 48273970055SRussell King 48373970055SRussell King if (err != sizeof(id)) { 48473970055SRussell King dev_err(sfp->dev, "EEPROM short read: %d\n", err); 48573970055SRussell King return -EAGAIN; 48673970055SRussell King } 48773970055SRussell King 48873970055SRussell King /* Validate the checksum over the base structure */ 48973970055SRussell King check = sfp_check(&id.base, sizeof(id.base) - 1); 49073970055SRussell King if (check != id.base.cc_base) { 49173970055SRussell King dev_err(sfp->dev, 49273970055SRussell King "EEPROM base structure checksum failure: 0x%02x\n", 49373970055SRussell King check); 49473970055SRussell King print_hex_dump(KERN_ERR, "sfp EE: ", DUMP_PREFIX_OFFSET, 49573970055SRussell King 16, 1, &id, sizeof(id.base) - 1, true); 49673970055SRussell King return -EINVAL; 49773970055SRussell King } 49873970055SRussell King 49973970055SRussell King check = sfp_check(&id.ext, sizeof(id.ext) - 1); 50073970055SRussell King if (check != id.ext.cc_ext) { 50173970055SRussell King dev_err(sfp->dev, 50273970055SRussell King "EEPROM extended structure checksum failure: 0x%02x\n", 50373970055SRussell King check); 50473970055SRussell King memset(&id.ext, 0, sizeof(id.ext)); 50573970055SRussell King } 50673970055SRussell King 50773970055SRussell King sfp->id = id; 50873970055SRussell King 50973970055SRussell King memcpy(vendor, sfp->id.base.vendor_name, 16); 51073970055SRussell King vendor[16] = '\0'; 51173970055SRussell King memcpy(part, sfp->id.base.vendor_pn, 16); 51273970055SRussell King part[16] = '\0'; 51373970055SRussell King memcpy(rev, sfp->id.base.vendor_rev, 4); 51473970055SRussell King rev[4] = '\0'; 51573970055SRussell King memcpy(sn, sfp->id.ext.vendor_sn, 16); 51673970055SRussell King sn[16] = '\0'; 51773970055SRussell King memcpy(date, sfp->id.ext.datecode, 8); 51873970055SRussell King date[8] = '\0'; 51973970055SRussell King 520516b29edSFlorian Fainelli dev_info(sfp->dev, "module %s %s rev %s sn %s dc %s\n", 521516b29edSFlorian Fainelli vendor, part, rev, sn, date); 52273970055SRussell King 523259c8618SRussell King /* Check whether we support this module */ 524259c8618SRussell King if (!sfp->type->module_supported(&sfp->id)) { 525259c8618SRussell King dev_err(sfp->dev, 526259c8618SRussell King "module is not supported - phys id 0x%02x 0x%02x\n", 52773970055SRussell King sfp->id.base.phys_id, sfp->id.base.phys_ext_id); 52873970055SRussell King return -EINVAL; 52973970055SRussell King } 53073970055SRussell King 531ec7681bdSRussell King /* If the module requires address swap mode, warn about it */ 532ec7681bdSRussell King if (sfp->id.ext.diagmon & SFP_DIAGMON_ADDRMODE) 533ec7681bdSRussell King dev_warn(sfp->dev, 534ec7681bdSRussell King "module address swap to access page 0xA2 is not supported.\n"); 535ec7681bdSRussell King 53673970055SRussell King return sfp_module_insert(sfp->sfp_bus, &sfp->id); 53773970055SRussell King } 53873970055SRussell King 53973970055SRussell King static void sfp_sm_mod_remove(struct sfp *sfp) 54073970055SRussell King { 54173970055SRussell King sfp_module_remove(sfp->sfp_bus); 54273970055SRussell King 54373970055SRussell King if (sfp->mod_phy) 54473970055SRussell King sfp_sm_phy_detach(sfp); 54573970055SRussell King 54673970055SRussell King sfp_module_tx_disable(sfp); 54773970055SRussell King 54873970055SRussell King memset(&sfp->id, 0, sizeof(sfp->id)); 54973970055SRussell King 55073970055SRussell King dev_info(sfp->dev, "module removed\n"); 55173970055SRussell King } 55273970055SRussell King 55373970055SRussell King static void sfp_sm_event(struct sfp *sfp, unsigned int event) 55473970055SRussell King { 55573970055SRussell King mutex_lock(&sfp->sm_mutex); 55673970055SRussell King 55773970055SRussell King dev_dbg(sfp->dev, "SM: enter %u:%u:%u event %u\n", 55873970055SRussell King sfp->sm_mod_state, sfp->sm_dev_state, sfp->sm_state, event); 55973970055SRussell King 56073970055SRussell King /* This state machine tracks the insert/remove state of 56173970055SRussell King * the module, and handles probing the on-board EEPROM. 56273970055SRussell King */ 56373970055SRussell King switch (sfp->sm_mod_state) { 56473970055SRussell King default: 56573970055SRussell King if (event == SFP_E_INSERT) { 56673970055SRussell King sfp_module_tx_disable(sfp); 56773970055SRussell King sfp_sm_ins_next(sfp, SFP_MOD_PROBE, T_PROBE_INIT); 56873970055SRussell King } 56973970055SRussell King break; 57073970055SRussell King 57173970055SRussell King case SFP_MOD_PROBE: 57273970055SRussell King if (event == SFP_E_REMOVE) { 57373970055SRussell King sfp_sm_ins_next(sfp, SFP_MOD_EMPTY, 0); 57473970055SRussell King } else if (event == SFP_E_TIMEOUT) { 57573970055SRussell King int err = sfp_sm_mod_probe(sfp); 57673970055SRussell King 57773970055SRussell King if (err == 0) 57873970055SRussell King sfp_sm_ins_next(sfp, SFP_MOD_PRESENT, 0); 57973970055SRussell King else if (err == -EAGAIN) 58073970055SRussell King sfp_sm_set_timer(sfp, T_PROBE_RETRY); 58173970055SRussell King else 58273970055SRussell King sfp_sm_ins_next(sfp, SFP_MOD_ERROR, 0); 58373970055SRussell King } 58473970055SRussell King break; 58573970055SRussell King 58673970055SRussell King case SFP_MOD_PRESENT: 58773970055SRussell King case SFP_MOD_ERROR: 58873970055SRussell King if (event == SFP_E_REMOVE) { 58973970055SRussell King sfp_sm_mod_remove(sfp); 59073970055SRussell King sfp_sm_ins_next(sfp, SFP_MOD_EMPTY, 0); 59173970055SRussell King } 59273970055SRussell King break; 59373970055SRussell King } 59473970055SRussell King 59573970055SRussell King /* This state machine tracks the netdev up/down state */ 59673970055SRussell King switch (sfp->sm_dev_state) { 59773970055SRussell King default: 59873970055SRussell King if (event == SFP_E_DEV_UP) 59973970055SRussell King sfp->sm_dev_state = SFP_DEV_UP; 60073970055SRussell King break; 60173970055SRussell King 60273970055SRussell King case SFP_DEV_UP: 60373970055SRussell King if (event == SFP_E_DEV_DOWN) { 60473970055SRussell King /* If the module has a PHY, avoid raising TX disable 60573970055SRussell King * as this resets the PHY. Otherwise, raise it to 60673970055SRussell King * turn the laser off. 60773970055SRussell King */ 60873970055SRussell King if (!sfp->mod_phy) 60973970055SRussell King sfp_module_tx_disable(sfp); 61073970055SRussell King sfp->sm_dev_state = SFP_DEV_DOWN; 61173970055SRussell King } 61273970055SRussell King break; 61373970055SRussell King } 61473970055SRussell King 61573970055SRussell King /* Some events are global */ 61673970055SRussell King if (sfp->sm_state != SFP_S_DOWN && 61773970055SRussell King (sfp->sm_mod_state != SFP_MOD_PRESENT || 61873970055SRussell King sfp->sm_dev_state != SFP_DEV_UP)) { 61973970055SRussell King if (sfp->sm_state == SFP_S_LINK_UP && 62073970055SRussell King sfp->sm_dev_state == SFP_DEV_UP) 62173970055SRussell King sfp_sm_link_down(sfp); 62273970055SRussell King if (sfp->mod_phy) 62373970055SRussell King sfp_sm_phy_detach(sfp); 62473970055SRussell King sfp_sm_next(sfp, SFP_S_DOWN, 0); 62573970055SRussell King mutex_unlock(&sfp->sm_mutex); 62673970055SRussell King return; 62773970055SRussell King } 62873970055SRussell King 62973970055SRussell King /* The main state machine */ 63073970055SRussell King switch (sfp->sm_state) { 63173970055SRussell King case SFP_S_DOWN: 63273970055SRussell King if (sfp->sm_mod_state == SFP_MOD_PRESENT && 63373970055SRussell King sfp->sm_dev_state == SFP_DEV_UP) 63473970055SRussell King sfp_sm_mod_init(sfp); 63573970055SRussell King break; 63673970055SRussell King 63773970055SRussell King case SFP_S_INIT: 63873970055SRussell King if (event == SFP_E_TIMEOUT && sfp->state & SFP_F_TX_FAULT) 63973970055SRussell King sfp_sm_fault(sfp, true); 64073970055SRussell King else if (event == SFP_E_TIMEOUT || event == SFP_E_TX_CLEAR) 64173970055SRussell King sfp_sm_link_check_los(sfp); 64273970055SRussell King break; 64373970055SRussell King 64473970055SRussell King case SFP_S_WAIT_LOS: 64573970055SRussell King if (event == SFP_E_TX_FAULT) 64673970055SRussell King sfp_sm_fault(sfp, true); 647710dfbb0SRussell King else if (sfp_los_event_inactive(sfp, event)) 64873970055SRussell King sfp_sm_link_up(sfp); 64973970055SRussell King break; 65073970055SRussell King 65173970055SRussell King case SFP_S_LINK_UP: 65273970055SRussell King if (event == SFP_E_TX_FAULT) { 65373970055SRussell King sfp_sm_link_down(sfp); 65473970055SRussell King sfp_sm_fault(sfp, true); 655710dfbb0SRussell King } else if (sfp_los_event_active(sfp, event)) { 65673970055SRussell King sfp_sm_link_down(sfp); 65773970055SRussell King sfp_sm_next(sfp, SFP_S_WAIT_LOS, 0); 65873970055SRussell King } 65973970055SRussell King break; 66073970055SRussell King 66173970055SRussell King case SFP_S_TX_FAULT: 66273970055SRussell King if (event == SFP_E_TIMEOUT) { 66373970055SRussell King sfp_module_tx_fault_reset(sfp); 66473970055SRussell King sfp_sm_next(sfp, SFP_S_REINIT, T_INIT_JIFFIES); 66573970055SRussell King } 66673970055SRussell King break; 66773970055SRussell King 66873970055SRussell King case SFP_S_REINIT: 66973970055SRussell King if (event == SFP_E_TIMEOUT && sfp->state & SFP_F_TX_FAULT) { 67073970055SRussell King sfp_sm_fault(sfp, false); 67173970055SRussell King } else if (event == SFP_E_TIMEOUT || event == SFP_E_TX_CLEAR) { 67273970055SRussell King dev_info(sfp->dev, "module transmit fault recovered\n"); 67373970055SRussell King sfp_sm_link_check_los(sfp); 67473970055SRussell King } 67573970055SRussell King break; 67673970055SRussell King 67773970055SRussell King case SFP_S_TX_DISABLE: 67873970055SRussell King break; 67973970055SRussell King } 68073970055SRussell King 68173970055SRussell King dev_dbg(sfp->dev, "SM: exit %u:%u:%u\n", 68273970055SRussell King sfp->sm_mod_state, sfp->sm_dev_state, sfp->sm_state); 68373970055SRussell King 68473970055SRussell King mutex_unlock(&sfp->sm_mutex); 68573970055SRussell King } 68673970055SRussell King 68773970055SRussell King static void sfp_start(struct sfp *sfp) 68873970055SRussell King { 68973970055SRussell King sfp_sm_event(sfp, SFP_E_DEV_UP); 69073970055SRussell King } 69173970055SRussell King 69273970055SRussell King static void sfp_stop(struct sfp *sfp) 69373970055SRussell King { 69473970055SRussell King sfp_sm_event(sfp, SFP_E_DEV_DOWN); 69573970055SRussell King } 69673970055SRussell King 69773970055SRussell King static int sfp_module_info(struct sfp *sfp, struct ethtool_modinfo *modinfo) 69873970055SRussell King { 69973970055SRussell King /* locking... and check module is present */ 70073970055SRussell King 701ec7681bdSRussell King if (sfp->id.ext.sff8472_compliance && 702ec7681bdSRussell King !(sfp->id.ext.diagmon & SFP_DIAGMON_ADDRMODE)) { 70373970055SRussell King modinfo->type = ETH_MODULE_SFF_8472; 70473970055SRussell King modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN; 70573970055SRussell King } else { 70673970055SRussell King modinfo->type = ETH_MODULE_SFF_8079; 70773970055SRussell King modinfo->eeprom_len = ETH_MODULE_SFF_8079_LEN; 70873970055SRussell King } 70973970055SRussell King return 0; 71073970055SRussell King } 71173970055SRussell King 71273970055SRussell King static int sfp_module_eeprom(struct sfp *sfp, struct ethtool_eeprom *ee, 71373970055SRussell King u8 *data) 71473970055SRussell King { 71573970055SRussell King unsigned int first, last, len; 71673970055SRussell King int ret; 71773970055SRussell King 71873970055SRussell King if (ee->len == 0) 71973970055SRussell King return -EINVAL; 72073970055SRussell King 72173970055SRussell King first = ee->offset; 72273970055SRussell King last = ee->offset + ee->len; 72373970055SRussell King if (first < ETH_MODULE_SFF_8079_LEN) { 72473970055SRussell King len = min_t(unsigned int, last, ETH_MODULE_SFF_8079_LEN); 72573970055SRussell King len -= first; 72673970055SRussell King 7272794ffc4SRussell King ret = sfp_read(sfp, false, first, data, len); 72873970055SRussell King if (ret < 0) 72973970055SRussell King return ret; 73073970055SRussell King 73173970055SRussell King first += len; 73273970055SRussell King data += len; 73373970055SRussell King } 7342794ffc4SRussell King if (first < ETH_MODULE_SFF_8472_LEN && last > ETH_MODULE_SFF_8079_LEN) { 73573970055SRussell King len = min_t(unsigned int, last, ETH_MODULE_SFF_8472_LEN); 73673970055SRussell King len -= first; 73773970055SRussell King first -= ETH_MODULE_SFF_8079_LEN; 73873970055SRussell King 7392794ffc4SRussell King ret = sfp_read(sfp, true, first, data, len); 74073970055SRussell King if (ret < 0) 74173970055SRussell King return ret; 74273970055SRussell King } 74373970055SRussell King return 0; 74473970055SRussell King } 74573970055SRussell King 74673970055SRussell King static const struct sfp_socket_ops sfp_module_ops = { 74773970055SRussell King .start = sfp_start, 74873970055SRussell King .stop = sfp_stop, 74973970055SRussell King .module_info = sfp_module_info, 75073970055SRussell King .module_eeprom = sfp_module_eeprom, 75173970055SRussell King }; 75273970055SRussell King 75373970055SRussell King static void sfp_timeout(struct work_struct *work) 75473970055SRussell King { 75573970055SRussell King struct sfp *sfp = container_of(work, struct sfp, timeout.work); 75673970055SRussell King 75773970055SRussell King rtnl_lock(); 75873970055SRussell King sfp_sm_event(sfp, SFP_E_TIMEOUT); 75973970055SRussell King rtnl_unlock(); 76073970055SRussell King } 76173970055SRussell King 76273970055SRussell King static void sfp_check_state(struct sfp *sfp) 76373970055SRussell King { 76473970055SRussell King unsigned int state, i, changed; 76573970055SRussell King 76673970055SRussell King state = sfp_get_state(sfp); 76773970055SRussell King changed = state ^ sfp->state; 76873970055SRussell King changed &= SFP_F_PRESENT | SFP_F_LOS | SFP_F_TX_FAULT; 76973970055SRussell King 77073970055SRussell King for (i = 0; i < GPIO_MAX; i++) 77173970055SRussell King if (changed & BIT(i)) 77273970055SRussell King dev_dbg(sfp->dev, "%s %u -> %u\n", gpio_of_names[i], 77373970055SRussell King !!(sfp->state & BIT(i)), !!(state & BIT(i))); 77473970055SRussell King 77573970055SRussell King state |= sfp->state & (SFP_F_TX_DISABLE | SFP_F_RATE_SELECT); 77673970055SRussell King sfp->state = state; 77773970055SRussell King 77873970055SRussell King rtnl_lock(); 77973970055SRussell King if (changed & SFP_F_PRESENT) 78073970055SRussell King sfp_sm_event(sfp, state & SFP_F_PRESENT ? 78173970055SRussell King SFP_E_INSERT : SFP_E_REMOVE); 78273970055SRussell King 78373970055SRussell King if (changed & SFP_F_TX_FAULT) 78473970055SRussell King sfp_sm_event(sfp, state & SFP_F_TX_FAULT ? 78573970055SRussell King SFP_E_TX_FAULT : SFP_E_TX_CLEAR); 78673970055SRussell King 78773970055SRussell King if (changed & SFP_F_LOS) 78873970055SRussell King sfp_sm_event(sfp, state & SFP_F_LOS ? 78973970055SRussell King SFP_E_LOS_HIGH : SFP_E_LOS_LOW); 79073970055SRussell King rtnl_unlock(); 79173970055SRussell King } 79273970055SRussell King 79373970055SRussell King static irqreturn_t sfp_irq(int irq, void *data) 79473970055SRussell King { 79573970055SRussell King struct sfp *sfp = data; 79673970055SRussell King 79773970055SRussell King sfp_check_state(sfp); 79873970055SRussell King 79973970055SRussell King return IRQ_HANDLED; 80073970055SRussell King } 80173970055SRussell King 80273970055SRussell King static void sfp_poll(struct work_struct *work) 80373970055SRussell King { 80473970055SRussell King struct sfp *sfp = container_of(work, struct sfp, poll.work); 80573970055SRussell King 80673970055SRussell King sfp_check_state(sfp); 80773970055SRussell King mod_delayed_work(system_wq, &sfp->poll, poll_jiffies); 80873970055SRussell King } 80973970055SRussell King 81073970055SRussell King static struct sfp *sfp_alloc(struct device *dev) 81173970055SRussell King { 81273970055SRussell King struct sfp *sfp; 81373970055SRussell King 81473970055SRussell King sfp = kzalloc(sizeof(*sfp), GFP_KERNEL); 81573970055SRussell King if (!sfp) 81673970055SRussell King return ERR_PTR(-ENOMEM); 81773970055SRussell King 81873970055SRussell King sfp->dev = dev; 81973970055SRussell King 82073970055SRussell King mutex_init(&sfp->sm_mutex); 82173970055SRussell King INIT_DELAYED_WORK(&sfp->poll, sfp_poll); 82273970055SRussell King INIT_DELAYED_WORK(&sfp->timeout, sfp_timeout); 82373970055SRussell King 82473970055SRussell King return sfp; 82573970055SRussell King } 82673970055SRussell King 82773970055SRussell King static void sfp_cleanup(void *data) 82873970055SRussell King { 82973970055SRussell King struct sfp *sfp = data; 83073970055SRussell King 83173970055SRussell King cancel_delayed_work_sync(&sfp->poll); 83273970055SRussell King cancel_delayed_work_sync(&sfp->timeout); 83373970055SRussell King if (sfp->i2c_mii) { 83473970055SRussell King mdiobus_unregister(sfp->i2c_mii); 83573970055SRussell King mdiobus_free(sfp->i2c_mii); 83673970055SRussell King } 83773970055SRussell King if (sfp->i2c) 83873970055SRussell King i2c_put_adapter(sfp->i2c); 83973970055SRussell King kfree(sfp); 84073970055SRussell King } 84173970055SRussell King 84273970055SRussell King static int sfp_probe(struct platform_device *pdev) 84373970055SRussell King { 844259c8618SRussell King const struct sff_data *sff; 84573970055SRussell King struct sfp *sfp; 84673970055SRussell King bool poll = false; 84773970055SRussell King int irq, err, i; 84873970055SRussell King 84973970055SRussell King sfp = sfp_alloc(&pdev->dev); 85073970055SRussell King if (IS_ERR(sfp)) 85173970055SRussell King return PTR_ERR(sfp); 85273970055SRussell King 85373970055SRussell King platform_set_drvdata(pdev, sfp); 85473970055SRussell King 85573970055SRussell King err = devm_add_action(sfp->dev, sfp_cleanup, sfp); 85673970055SRussell King if (err < 0) 85773970055SRussell King return err; 85873970055SRussell King 859259c8618SRussell King sff = sfp->type = &sfp_data; 860259c8618SRussell King 86173970055SRussell King if (pdev->dev.of_node) { 86273970055SRussell King struct device_node *node = pdev->dev.of_node; 863259c8618SRussell King const struct of_device_id *id; 86473970055SRussell King struct device_node *np; 86573970055SRussell King 866259c8618SRussell King id = of_match_node(sfp_of_match, node); 867259c8618SRussell King if (WARN_ON(!id)) 868259c8618SRussell King return -EINVAL; 869259c8618SRussell King 870259c8618SRussell King sff = sfp->type = id->data; 871259c8618SRussell King 87273970055SRussell King np = of_parse_phandle(node, "i2c-bus", 0); 87373970055SRussell King if (np) { 87473970055SRussell King struct i2c_adapter *i2c; 87573970055SRussell King 87673970055SRussell King i2c = of_find_i2c_adapter_by_node(np); 87773970055SRussell King of_node_put(np); 87873970055SRussell King if (!i2c) 87973970055SRussell King return -EPROBE_DEFER; 88073970055SRussell King 88173970055SRussell King err = sfp_i2c_configure(sfp, i2c); 88273970055SRussell King if (err < 0) { 88373970055SRussell King i2c_put_adapter(i2c); 88473970055SRussell King return err; 88573970055SRussell King } 88673970055SRussell King } 887259c8618SRussell King } 88873970055SRussell King 889259c8618SRussell King for (i = 0; i < GPIO_MAX; i++) 890259c8618SRussell King if (sff->gpios & BIT(i)) { 89173970055SRussell King sfp->gpio[i] = devm_gpiod_get_optional(sfp->dev, 89273970055SRussell King gpio_of_names[i], gpio_flags[i]); 89373970055SRussell King if (IS_ERR(sfp->gpio[i])) 89473970055SRussell King return PTR_ERR(sfp->gpio[i]); 89573970055SRussell King } 89673970055SRussell King 89773970055SRussell King sfp->get_state = sfp_gpio_get_state; 89873970055SRussell King sfp->set_state = sfp_gpio_set_state; 899259c8618SRussell King 900259c8618SRussell King /* Modules that have no detect signal are always present */ 901259c8618SRussell King if (!(sfp->gpio[GPIO_MODDEF0])) 902259c8618SRussell King sfp->get_state = sff_gpio_get_state; 90373970055SRussell King 90473970055SRussell King sfp->sfp_bus = sfp_register_socket(sfp->dev, sfp, &sfp_module_ops); 90573970055SRussell King if (!sfp->sfp_bus) 90673970055SRussell King return -ENOMEM; 90773970055SRussell King 90873970055SRussell King /* Get the initial state, and always signal TX disable, 90973970055SRussell King * since the network interface will not be up. 91073970055SRussell King */ 91173970055SRussell King sfp->state = sfp_get_state(sfp) | SFP_F_TX_DISABLE; 91273970055SRussell King 91373970055SRussell King if (sfp->gpio[GPIO_RATE_SELECT] && 91473970055SRussell King gpiod_get_value_cansleep(sfp->gpio[GPIO_RATE_SELECT])) 91573970055SRussell King sfp->state |= SFP_F_RATE_SELECT; 91673970055SRussell King sfp_set_state(sfp, sfp->state); 91773970055SRussell King sfp_module_tx_disable(sfp); 91873970055SRussell King rtnl_lock(); 91973970055SRussell King if (sfp->state & SFP_F_PRESENT) 92073970055SRussell King sfp_sm_event(sfp, SFP_E_INSERT); 92173970055SRussell King rtnl_unlock(); 92273970055SRussell King 92373970055SRussell King for (i = 0; i < GPIO_MAX; i++) { 92473970055SRussell King if (gpio_flags[i] != GPIOD_IN || !sfp->gpio[i]) 92573970055SRussell King continue; 92673970055SRussell King 92773970055SRussell King irq = gpiod_to_irq(sfp->gpio[i]); 92873970055SRussell King if (!irq) { 92973970055SRussell King poll = true; 93073970055SRussell King continue; 93173970055SRussell King } 93273970055SRussell King 93373970055SRussell King err = devm_request_threaded_irq(sfp->dev, irq, NULL, sfp_irq, 93473970055SRussell King IRQF_ONESHOT | 93573970055SRussell King IRQF_TRIGGER_RISING | 93673970055SRussell King IRQF_TRIGGER_FALLING, 93773970055SRussell King dev_name(sfp->dev), sfp); 93873970055SRussell King if (err) 93973970055SRussell King poll = true; 94073970055SRussell King } 94173970055SRussell King 94273970055SRussell King if (poll) 94373970055SRussell King mod_delayed_work(system_wq, &sfp->poll, poll_jiffies); 94473970055SRussell King 94573970055SRussell King return 0; 94673970055SRussell King } 94773970055SRussell King 94873970055SRussell King static int sfp_remove(struct platform_device *pdev) 94973970055SRussell King { 95073970055SRussell King struct sfp *sfp = platform_get_drvdata(pdev); 95173970055SRussell King 95273970055SRussell King sfp_unregister_socket(sfp->sfp_bus); 95373970055SRussell King 95473970055SRussell King return 0; 95573970055SRussell King } 95673970055SRussell King 95773970055SRussell King static struct platform_driver sfp_driver = { 95873970055SRussell King .probe = sfp_probe, 95973970055SRussell King .remove = sfp_remove, 96073970055SRussell King .driver = { 96173970055SRussell King .name = "sfp", 96273970055SRussell King .of_match_table = sfp_of_match, 96373970055SRussell King }, 96473970055SRussell King }; 96573970055SRussell King 96673970055SRussell King static int sfp_init(void) 96773970055SRussell King { 96873970055SRussell King poll_jiffies = msecs_to_jiffies(100); 96973970055SRussell King 97073970055SRussell King return platform_driver_register(&sfp_driver); 97173970055SRussell King } 97273970055SRussell King module_init(sfp_init); 97373970055SRussell King 97473970055SRussell King static void sfp_exit(void) 97573970055SRussell King { 97673970055SRussell King platform_driver_unregister(&sfp_driver); 97773970055SRussell King } 97873970055SRussell King module_exit(sfp_exit); 97973970055SRussell King 98073970055SRussell King MODULE_ALIAS("platform:sfp"); 98173970055SRussell King MODULE_AUTHOR("Russell King"); 98273970055SRussell King MODULE_LICENSE("GPL v2"); 983