Lines Matching full:mux
10 #include <linux/i2c-mux.h>
15 #include <linux/platform_data/i2c-mux-reg.h>
23 static int i2c_mux_reg_set(const struct regmux *mux, unsigned int chan_id)
25 if (!mux->data.reg)
34 switch (mux->data.reg_size) {
36 if (mux->data.little_endian)
37 iowrite32(chan_id, mux->data.reg);
39 iowrite32be(chan_id, mux->data.reg);
40 if (!mux->data.write_only)
41 ioread32(mux->data.reg);
44 if (mux->data.little_endian)
45 iowrite16(chan_id, mux->data.reg);
47 iowrite16be(chan_id, mux->data.reg);
48 if (!mux->data.write_only)
49 ioread16(mux->data.reg);
52 iowrite8(chan_id, mux->data.reg);
53 if (!mux->data.write_only)
54 ioread8(mux->data.reg);
63 struct regmux *mux = i2c_mux_priv(muxc);
65 return i2c_mux_reg_set(mux, chan);
70 struct regmux *mux = i2c_mux_priv(muxc);
72 if (mux->data.idle_in_use)
73 return i2c_mux_reg_set(mux, mux->data.idle);
79 static int i2c_mux_reg_probe_dt(struct regmux *mux,
102 mux->data.parent = i2c_adapter_id(adapter);
105 mux->data.n_values = of_get_child_count(np);
107 mux->data.little_endian = true;
109 mux->data.little_endian = false;
113 mux->data.little_endian = true;
116 mux->data.little_endian = false;
121 mux->data.write_only = of_property_read_bool(np, "write-only");
124 mux->data.n_values, sizeof(*mux->data.values),
133 mux->data.values = values;
135 if (!of_property_read_u32(np, "idle-state", &mux->data.idle))
136 mux->data.idle_in_use = true;
140 mux->data.reg_size = resource_size(&res);
141 mux->data.reg = devm_ioremap_resource(&pdev->dev, &res);
142 if (IS_ERR(mux->data.reg))
143 return PTR_ERR(mux->data.reg);
149 static int i2c_mux_reg_probe_dt(struct regmux *mux,
159 struct regmux *mux;
164 mux = devm_kzalloc(&pdev->dev, sizeof(*mux), GFP_KERNEL);
165 if (!mux)
169 memcpy(&mux->data, dev_get_platdata(&pdev->dev),
170 sizeof(mux->data));
172 ret = i2c_mux_reg_probe_dt(mux, pdev);
178 parent = i2c_get_adapter(mux->data.parent);
182 if (!mux->data.reg) {
185 mux->data.reg = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
186 if (IS_ERR(mux->data.reg)) {
187 ret = PTR_ERR(mux->data.reg);
190 mux->data.reg_size = resource_size(res);
193 if (mux->data.reg_size != 4 && mux->data.reg_size != 2 &&
194 mux->data.reg_size != 1) {
200 muxc = i2c_mux_alloc(parent, &pdev->dev, mux->data.n_values, 0, 0,
206 muxc->priv = mux;
210 if (mux->data.idle_in_use)
213 for (i = 0; i < mux->data.n_values; i++) {
214 nr = mux->data.base_nr ? (mux->data.base_nr + i) : 0;
216 ret = i2c_mux_add_adapter(muxc, nr, mux->data.values[i]);
221 dev_dbg(&pdev->dev, "%d port mux on %s adapter\n",
222 mux->data.n_values, muxc->parent->name);
243 { .compatible = "i2c-mux-reg", },
252 .name = "i2c-mux-reg",
262 MODULE_ALIAS("platform:i2c-mux-reg");