Lines Matching refs:priv

47 static inline void realtek_smi_clk_delay(struct realtek_priv *priv)
49 ndelay(priv->variant->clk_delay);
52 static void realtek_smi_start(struct realtek_priv *priv)
57 gpiod_direction_output(priv->mdc, 0);
58 gpiod_direction_output(priv->mdio, 1);
59 realtek_smi_clk_delay(priv);
62 gpiod_set_value(priv->mdc, 1);
63 realtek_smi_clk_delay(priv);
64 gpiod_set_value(priv->mdc, 0);
65 realtek_smi_clk_delay(priv);
68 gpiod_set_value(priv->mdc, 1);
69 realtek_smi_clk_delay(priv);
70 gpiod_set_value(priv->mdio, 0);
71 realtek_smi_clk_delay(priv);
72 gpiod_set_value(priv->mdc, 0);
73 realtek_smi_clk_delay(priv);
74 gpiod_set_value(priv->mdio, 1);
77 static void realtek_smi_stop(struct realtek_priv *priv)
79 realtek_smi_clk_delay(priv);
80 gpiod_set_value(priv->mdio, 0);
81 gpiod_set_value(priv->mdc, 1);
82 realtek_smi_clk_delay(priv);
83 gpiod_set_value(priv->mdio, 1);
84 realtek_smi_clk_delay(priv);
85 gpiod_set_value(priv->mdc, 1);
86 realtek_smi_clk_delay(priv);
87 gpiod_set_value(priv->mdc, 0);
88 realtek_smi_clk_delay(priv);
89 gpiod_set_value(priv->mdc, 1);
92 realtek_smi_clk_delay(priv);
93 gpiod_set_value(priv->mdc, 0);
94 realtek_smi_clk_delay(priv);
95 gpiod_set_value(priv->mdc, 1);
98 gpiod_direction_input(priv->mdio);
99 gpiod_direction_input(priv->mdc);
102 static void realtek_smi_write_bits(struct realtek_priv *priv, u32 data, u32 len)
105 realtek_smi_clk_delay(priv);
108 gpiod_set_value(priv->mdio, !!(data & (1 << (len - 1))));
109 realtek_smi_clk_delay(priv);
112 gpiod_set_value(priv->mdc, 1);
113 realtek_smi_clk_delay(priv);
114 gpiod_set_value(priv->mdc, 0);
118 static void realtek_smi_read_bits(struct realtek_priv *priv, u32 len, u32 *data)
120 gpiod_direction_input(priv->mdio);
125 realtek_smi_clk_delay(priv);
128 gpiod_set_value(priv->mdc, 1);
129 realtek_smi_clk_delay(priv);
130 u = !!gpiod_get_value(priv->mdio);
131 gpiod_set_value(priv->mdc, 0);
136 gpiod_direction_output(priv->mdio, 0);
139 static int realtek_smi_wait_for_ack(struct realtek_priv *priv)
147 realtek_smi_read_bits(priv, 1, &ack);
152 dev_err(priv->dev, "ACK timeout\n");
160 static int realtek_smi_write_byte(struct realtek_priv *priv, u8 data)
162 realtek_smi_write_bits(priv, data, 8);
163 return realtek_smi_wait_for_ack(priv);
166 static int realtek_smi_write_byte_noack(struct realtek_priv *priv, u8 data)
168 realtek_smi_write_bits(priv, data, 8);
172 static int realtek_smi_read_byte0(struct realtek_priv *priv, u8 *data)
177 realtek_smi_read_bits(priv, 8, &t);
181 realtek_smi_write_bits(priv, 0x00, 1);
186 static int realtek_smi_read_byte1(struct realtek_priv *priv, u8 *data)
191 realtek_smi_read_bits(priv, 8, &t);
195 realtek_smi_write_bits(priv, 0x01, 1);
200 static int realtek_smi_read_reg(struct realtek_priv *priv, u32 addr, u32 *data)
207 spin_lock_irqsave(&priv->lock, flags);
209 realtek_smi_start(priv);
212 ret = realtek_smi_write_byte(priv, priv->variant->cmd_read);
217 ret = realtek_smi_write_byte(priv, addr & 0xff);
222 ret = realtek_smi_write_byte(priv, addr >> 8);
227 realtek_smi_read_byte0(priv, &lo);
229 realtek_smi_read_byte1(priv, &hi);
236 realtek_smi_stop(priv);
237 spin_unlock_irqrestore(&priv->lock, flags);
242 static int realtek_smi_write_reg(struct realtek_priv *priv,
248 spin_lock_irqsave(&priv->lock, flags);
250 realtek_smi_start(priv);
253 ret = realtek_smi_write_byte(priv, priv->variant->cmd_write);
258 ret = realtek_smi_write_byte(priv, addr & 0xff);
263 ret = realtek_smi_write_byte(priv, addr >> 8);
268 ret = realtek_smi_write_byte(priv, data & 0xff);
274 ret = realtek_smi_write_byte(priv, data >> 8);
276 ret = realtek_smi_write_byte_noack(priv, data >> 8);
283 realtek_smi_stop(priv);
284 spin_unlock_irqrestore(&priv->lock, flags);
302 struct realtek_priv *priv = ctx;
304 return realtek_smi_write_reg(priv, reg, val, true);
309 struct realtek_priv *priv = ctx;
311 return realtek_smi_read_reg(priv, reg, val);
328 * Context: Can sleep. Takes and releases priv->map_lock.
334 struct realtek_priv *priv;
337 priv = rtl83xx_probe(dev, &realtek_smi_info);
338 if (IS_ERR(priv))
339 return PTR_ERR(priv);
342 priv->mdc = devm_gpiod_get_optional(dev, "mdc", GPIOD_OUT_LOW);
343 if (IS_ERR(priv->mdc)) {
344 rtl83xx_remove(priv);
345 return PTR_ERR(priv->mdc);
348 priv->mdio = devm_gpiod_get_optional(dev, "mdio", GPIOD_OUT_LOW);
349 if (IS_ERR(priv->mdio)) {
350 rtl83xx_remove(priv);
351 return PTR_ERR(priv->mdio);
354 priv->write_reg_noack = realtek_smi_write_reg_noack;
356 ret = rtl83xx_register_switch(priv);
358 rtl83xx_remove(priv);
378 struct realtek_priv *priv = platform_get_drvdata(pdev);
380 if (!priv)
383 rtl83xx_unregister_switch(priv);
385 rtl83xx_remove(priv);
401 struct realtek_priv *priv = platform_get_drvdata(pdev);
403 if (!priv)
406 rtl83xx_shutdown(priv);