|
@@ -20,23 +20,23 @@
|
|
|
struct mdio_mux_gpio_state {
|
|
|
struct gpio_descs *gpios;
|
|
|
void *mux_handle;
|
|
|
+ int values[];
|
|
|
};
|
|
|
|
|
|
static int mdio_mux_gpio_switch_fn(int current_child, int desired_child,
|
|
|
void *data)
|
|
|
{
|
|
|
struct mdio_mux_gpio_state *s = data;
|
|
|
- int values[s->gpios->ndescs];
|
|
|
unsigned int n;
|
|
|
|
|
|
if (current_child == desired_child)
|
|
|
return 0;
|
|
|
|
|
|
for (n = 0; n < s->gpios->ndescs; n++)
|
|
|
- values[n] = (desired_child >> n) & 1;
|
|
|
+ s->values[n] = (desired_child >> n) & 1;
|
|
|
|
|
|
gpiod_set_array_value_cansleep(s->gpios->ndescs, s->gpios->desc,
|
|
|
- values);
|
|
|
+ s->values);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -44,15 +44,21 @@ static int mdio_mux_gpio_switch_fn(int current_child, int desired_child,
|
|
|
static int mdio_mux_gpio_probe(struct platform_device *pdev)
|
|
|
{
|
|
|
struct mdio_mux_gpio_state *s;
|
|
|
+ struct gpio_descs *gpios;
|
|
|
int r;
|
|
|
|
|
|
- s = devm_kzalloc(&pdev->dev, sizeof(*s), GFP_KERNEL);
|
|
|
- if (!s)
|
|
|
+ gpios = gpiod_get_array(&pdev->dev, NULL, GPIOD_OUT_LOW);
|
|
|
+ if (IS_ERR(gpios))
|
|
|
+ return PTR_ERR(gpios);
|
|
|
+
|
|
|
+ s = devm_kzalloc(&pdev->dev, struct_size(s, values, gpios->ndescs),
|
|
|
+ GFP_KERNEL);
|
|
|
+ if (!s) {
|
|
|
+ gpiod_put_array(gpios);
|
|
|
return -ENOMEM;
|
|
|
+ }
|
|
|
|
|
|
- s->gpios = gpiod_get_array(&pdev->dev, NULL, GPIOD_OUT_LOW);
|
|
|
- if (IS_ERR(s->gpios))
|
|
|
- return PTR_ERR(s->gpios);
|
|
|
+ s->gpios = gpios;
|
|
|
|
|
|
r = mdio_mux_init(&pdev->dev, pdev->dev.of_node,
|
|
|
mdio_mux_gpio_switch_fn, &s->mux_handle, s, NULL);
|