blob: acb33757ab8a07fc907795d3df748bda33434c5a [file] [log] [blame]
Jan Kundrát25016432019-03-04 21:40:58 +01001diff --git a/Documentation/devicetree/bindings/pinctrl/pinctrl-mcp23s08.txt b/Documentation/devicetree/bindings/pinctrl/pinctrl-mcp23s08.txt
Jan Kundráta12acd92022-01-13 12:53:30 +01002index 2fa5edac7a35..4906544628ec 100644
Jan Kundrát25016432019-03-04 21:40:58 +01003--- a/Documentation/devicetree/bindings/pinctrl/pinctrl-mcp23s08.txt
4+++ b/Documentation/devicetree/bindings/pinctrl/pinctrl-mcp23s08.txt
Jan Kundráta12acd92022-01-13 12:53:30 +01005@@ -146,3 +146,38 @@ gpio21: gpio@21 {
Jan Kundrát25016432019-03-04 21:40:58 +01006 bias-pull-up;
7 };
8 };
9+
10+Line naming
11+===========
12+
13+Because several gpio_chip instances are hidden below a single device tree
14+node, it is necessary to split the names into several child nodes. Ensure
15+that the configured addresses match those in the microchip,spi-present-mask:
16+
17+gpio@0 {
Jan Kundráte7d21622019-03-28 22:52:38 +010018+ compatible = "microchip,mcp23s17";
19+ gpio-controller;
20+ #gpio-cells = <2>;
Jan Kundrát25016432019-03-04 21:40:58 +010021+ /* this bitmask has bits #0 (0x01) and #2 (0x04) set */
Jan Kundráte7d21622019-03-28 22:52:38 +010022+ spi-present-mask = <0x05>;
23+ reg = <0>;
24+ spi-max-frequency = <1000000>;
Jan Kundrát25016432019-03-04 21:40:58 +010025+
26+ gpio-bank@1 {
27+ address = <0>;
28+ gpio-line-names =
29+ "GPA0",
30+ "GPA1",
31+ ...
32+ "GPA7",
33+ "GPB0",
34+ "GPB1",
35+ ...
36+ "GPB7";
37+ };
38+
39+ gpio-bank@2 {
40+ address = <2>;
41+ gpio-line-names = ...
42+ };
43+};
Jan Kundrát0ef140f2023-09-14 12:14:43 +020044diff --git a/arch/arm/boot/dts/marvell/armada-388-clearfog.dtsi b/arch/arm/boot/dts/marvell/armada-388-clearfog.dtsi
Jan Kundrát9ce4f9e2022-02-17 16:38:57 +010045index f8a06ae4a3c9..8f32e05b6d87 100644
Jan Kundrát0ef140f2023-09-14 12:14:43 +020046--- a/arch/arm/boot/dts/marvell/armada-388-clearfog.dtsi
47+++ b/arch/arm/boot/dts/marvell/armada-388-clearfog.dtsi
Jan Kundrát9ce4f9e2022-02-17 16:38:57 +010048@@ -196,8 +196,12 @@ &i2c1 {
49 */
50 clock-frequency = <100000>;
51 pinctrl-0 = <&clearfog_i2c1_pins>;
52- pinctrl-names = "default";
53+ pinctrl-1 = <&clearfog_i2c1_recovery_pins>;
54+ pinctrl-names = "default", "gpio";
55 status = "okay";
56+ single-master;
57+ scl-gpios = <&gpio0 26 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
58+ sda-gpios = <&gpio0 27 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
59 };
60
61 &pinctrl {
62@@ -206,6 +210,10 @@ clearfog_i2c1_pins: i2c1-pins {
63 marvell,pins = "mpp26", "mpp27";
64 marvell,function = "i2c1";
65 };
66+ clearfog_i2c1_recovery_pins: i2c1-recovery-pins {
67+ marvell,pins = "mpp26", "mpp27";
68+ marvell,function = "gpio";
69+ };
70 clearfog_sdhci_cd_pins: clearfog-sdhci-cd-pins {
71 marvell,pins = "mpp20";
72 marvell,function = "gpio";
Jan Kundrát25016432019-03-04 21:40:58 +010073diff --git a/drivers/leds/leds-tlc591xx.c b/drivers/leds/leds-tlc591xx.c
Jan Kundrátda819402023-12-02 11:20:56 +010074index 945e831ef4ac..682ad60970d0 100644
Jan Kundrát25016432019-03-04 21:40:58 +010075--- a/drivers/leds/leds-tlc591xx.c
76+++ b/drivers/leds/leds-tlc591xx.c
Jan Kundrátda819402023-12-02 11:20:56 +010077@@ -39,6 +39,9 @@
Jan Kundrát25016432019-03-04 21:40:58 +010078
79 #define ldev_to_led(c) container_of(c, struct tlc591xx_led, ldev)
80
81+#define TLC591XX_RESET_BYTE_0 0xa5
82+#define TLC591XX_RESET_BYTE_1 0x5a
83+
84 struct tlc591xx_led {
85 bool active;
86 unsigned int led_no;
Jan Kundrátda819402023-12-02 11:20:56 +010087@@ -50,21 +53,25 @@ struct tlc591xx_priv {
Jan Kundrát25016432019-03-04 21:40:58 +010088 struct tlc591xx_led leds[TLC591XX_MAX_LEDS];
89 struct regmap *regmap;
90 unsigned int reg_ledout_offset;
91+ struct i2c_client *swrst_client;
92 };
93
94 struct tlc591xx {
95 unsigned int max_leds;
96 unsigned int reg_ledout_offset;
97+ u8 swrst_addr;
98 };
99
100 static const struct tlc591xx tlc59116 = {
101 .max_leds = 16,
102 .reg_ledout_offset = 0x14,
103+ .swrst_addr = 0x6b,
104 };
105
106 static const struct tlc591xx tlc59108 = {
107 .max_leds = 8,
108 .reg_ledout_offset = 0x0c,
109+ .swrst_addr = 0x4b,
110 };
111
112 static int
Jan Kundrátda819402023-12-02 11:20:56 +0100113@@ -178,6 +185,18 @@ tlc591xx_probe(struct i2c_client *client)
Jan Kundrát31bf7ae2020-02-14 17:03:53 +0100114
115 i2c_set_clientdata(client, priv);
Jan Kundrát25016432019-03-04 21:40:58 +0100116
Jan Kundrátf97c81d2020-02-06 00:33:19 +0100117+ priv->swrst_client = devm_i2c_new_dummy_device(dev, client->adapter, tlc591xx->swrst_addr);
Jan Kundrát89b682a2020-03-08 13:03:33 -0700118+ if (IS_ERR(priv->swrst_client)) {
119+ dev_info(dev, "Skipping reset: address %02x already used\n",
120+ tlc591xx->swrst_addr);
121+ } else {
Jan Kundrát25016432019-03-04 21:40:58 +0100122+ err = i2c_smbus_write_byte_data(priv->swrst_client,
123+ TLC591XX_RESET_BYTE_0, TLC591XX_RESET_BYTE_1);
124+ if (err) {
125+ dev_warn(dev, "SW reset failed\n");
126+ }
Jan Kundrát25016432019-03-04 21:40:58 +0100127+ }
128+
Jan Kundrát31bf7ae2020-02-14 17:03:53 +0100129 err = tlc591xx_set_mode(priv->regmap, MODE2_DIM);
130 if (err < 0)
131 return err;
Jan Kundrát0ef140f2023-09-14 12:14:43 +0200132diff --git a/drivers/leds/trigger/Kconfig b/drivers/leds/trigger/Kconfig
133index 2a57328eca20..dc6816d36d06 100644
134--- a/drivers/leds/trigger/Kconfig
135+++ b/drivers/leds/trigger/Kconfig
136@@ -83,7 +83,6 @@ config LEDS_TRIGGER_ACTIVITY
137 config LEDS_TRIGGER_GPIO
138 tristate "LED GPIO Trigger"
139 depends on GPIOLIB || COMPILE_TEST
140- depends on BROKEN
141 help
142 This allows LEDs to be controlled by gpio events. It's good
143 when using gpios as switches and triggering the needed LEDs
Jan Kundrát0341eea2020-10-16 18:06:38 +0200144diff --git a/drivers/pinctrl/pinctrl-mcp23s08_spi.c b/drivers/pinctrl/pinctrl-mcp23s08_spi.c
Jan Kundrát0ef140f2023-09-14 12:14:43 +0200145index ea059b9c5542..d58c6e631942 100644
Jan Kundrát0341eea2020-10-16 18:06:38 +0200146--- a/drivers/pinctrl/pinctrl-mcp23s08_spi.c
147+++ b/drivers/pinctrl/pinctrl-mcp23s08_spi.c
Jan Kundrátbf1e0912021-03-05 12:45:23 +0100148@@ -8,6 +8,7 @@
149 #include <linux/spi/spi.h>
Jan Kundrát0341eea2020-10-16 18:06:38 +0200150
Jan Kundrátbf1e0912021-03-05 12:45:23 +0100151 #include "pinctrl-mcp23s08.h"
152+#include "../gpio/gpiolib.h"
Jan Kundrát0341eea2020-10-16 18:06:38 +0200153
Jan Kundrátbf1e0912021-03-05 12:45:23 +0100154 #define MCP_MAX_DEV_PER_CS 8
Jan Kundrát0341eea2020-10-16 18:06:38 +0200155
Jan Kundrát0ef140f2023-09-14 12:14:43 +0200156@@ -153,6 +154,10 @@ static int mcp23s08_probe(struct spi_device *spi)
Jan Kundrát0341eea2020-10-16 18:06:38 +0200157 int type;
158 int ret;
159 u32 v;
160+ struct device_node *np;
Jan Kundrátbf1e0912021-03-05 12:45:23 +0100161+ int line_name_count;
162+ const char **names;
163+ int i;
Jan Kundrát0341eea2020-10-16 18:06:38 +0200164
165 match = device_get_match_data(dev);
Jan Kundrát25016432019-03-04 21:40:58 +0100166 if (match)
Jan Kundrát0ef140f2023-09-14 12:14:43 +0200167@@ -202,6 +207,43 @@ static int mcp23s08_probe(struct spi_device *spi)
Jan Kundrát0341eea2020-10-16 18:06:38 +0200168 return ret;
169
Jan Kundrát25016432019-03-04 21:40:58 +0100170 ngpio += data->mcp[addr]->chip.ngpio;
171+
172+ for_each_available_child_of_node(spi->dev.of_node, np) {
173+ u32 chip_addr;
Jan Kundrát0341eea2020-10-16 18:06:38 +0200174+ ret = of_property_read_u32(np, "address", &chip_addr);
175+ if (ret)
Jan Kundrát25016432019-03-04 21:40:58 +0100176+ continue;
177+ if (chip_addr != addr)
178+ continue;
Jan Kundrátbf1e0912021-03-05 12:45:23 +0100179+
180+ line_name_count = fwnode_property_read_string_array(of_fwnode_handle(np), "gpio-line-names", NULL, 0);
181+ if (line_name_count < 0)
182+ continue;
183+
184+ if (line_name_count > data->mcp[addr]->chip.ngpio) {
185+ dev_warn(&spi->dev, "gpio-line-names is length %d but should be at most length %d",
186+ line_name_count, data->mcp[addr]->chip.ngpio);
187+ line_name_count = data->mcp[addr]->chip.ngpio;
188+ }
189+
190+ names = kcalloc(line_name_count, sizeof(*names), GFP_KERNEL);
191+ if (!names) {
192+ dev_warn(&spi->dev, "cannot allocate gpio-line-names");
193+ continue;
194+ }
195+
196+ ret = fwnode_property_read_string_array(of_fwnode_handle(np), "gpio-line-names", names, line_name_count);
197+ if (ret < 0) {
198+ dev_warn(&spi->dev, "failed to read GPIO line names");
199+ kfree(names);
200+ continue;
201+ }
202+
203+ for (i = 0; i < line_name_count; i++)
204+ data->mcp[addr]->chip.gpiodev->descs[i].name = names[i];
205+
206+ kfree(names);
Jan Kundrát25016432019-03-04 21:40:58 +0100207+ }
208 }
209 data->ngpio = ngpio;
210
Jan Kundráte7d21622019-03-28 22:52:38 +0100211diff --git a/drivers/spi/spi-orion.c b/drivers/spi/spi-orion.c
Jan Kundrátda819402023-12-02 11:20:56 +0100212index 1f10f5c8e34d..25bde84af1cc 100644
Jan Kundráte7d21622019-03-28 22:52:38 +0100213--- a/drivers/spi/spi-orion.c
214+++ b/drivers/spi/spi-orion.c
Jan Kundrátda819402023-12-02 11:20:56 +0100215@@ -472,7 +472,7 @@ orion_spi_write_read(struct spi_device *spi, struct spi_transfer *xfer)
Jan Kundrát0ef140f2023-09-14 12:14:43 +0200216 int cs = spi_get_chipselect(spi, 0);
Jan Kundrát549db872019-03-05 12:23:25 +0100217 void __iomem *vaddr;
Jan Kundrát25016432019-03-04 21:40:58 +0100218
219- word_len = spi->bits_per_word;
220+ word_len = xfer->bits_per_word;
221 count = xfer->len;
222
Jan Kundrátda819402023-12-02 11:20:56 +0100223 orion_spi = spi_controller_get_devdata(spi->controller);
Jan Kundráte7d21622019-03-28 22:52:38 +0100224diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c
Jan Kundrátda819402023-12-02 11:20:56 +0100225index db3204d2a305..698567890e7b 100644
Jan Kundráte7d21622019-03-28 22:52:38 +0100226--- a/drivers/tty/serial/max310x.c
227+++ b/drivers/tty/serial/max310x.c
Jan Kundrátda819402023-12-02 11:20:56 +0100228@@ -27,9 +27,11 @@
229 #include <linux/uaccess.h>
230
231 #define MAX310X_NAME "max310x"
232+#define MAX310X_PORT_NAME_SUFFIX "port"
233 #define MAX310X_MAJOR 204
234 #define MAX310X_MINOR 209
235 #define MAX310X_UART_NRMAX 16
236+#define MAX310X_MAX_PORTS 4 /* Maximum number of UART ports per IC. */
237
238 /* MAX310X register definitions */
239 #define MAX310X_RHR_REG (0x00) /* RX FIFO */
240@@ -237,6 +239,10 @@
Jan Kundrát2bfe9ee2019-12-04 13:42:07 +0100241 #define MAX310x_REV_MASK (0xf8)
242 #define MAX310X_WRITE_BIT 0x80
Jan Kundráte7d21622019-03-28 22:52:38 +0100243
Jan Kundrát2bfe9ee2019-12-04 13:42:07 +0100244+/* Timeout for external crystal stability */
245+#define MAX310X_XTAL_WAIT_RETRIES 20
246+#define MAX310X_XTAL_WAIT_DELAY_MS 10
247+
248 /* MAX3107 specific */
249 #define MAX3107_REV_ID (0xa0)
Jan Kundráte7d21622019-03-28 22:52:38 +0100250
Jan Kundrátda819402023-12-02 11:20:56 +0100251@@ -641,11 +647,14 @@ static u32 max310x_set_ref_clk(struct device *dev, struct max310x_port *s,
Jan Kundrát2bfe9ee2019-12-04 13:42:07 +0100252
253 /* Wait for crystal */
254 if (xtal) {
255- unsigned int val;
256- msleep(10);
257- regmap_read(s->regmap, MAX310X_STS_IRQSTS_REG, &val);
258+ unsigned int val = 0, i;
259+ for (i = 0; i < MAX310X_XTAL_WAIT_RETRIES && !(val & MAX310X_STS_CLKREADY_BIT); ++i) {
260+ msleep(MAX310X_XTAL_WAIT_DELAY_MS);
261+ regmap_read(s->regmap, MAX310X_STS_IRQSTS_REG, &val);
262+ }
263 if (!(val & MAX310X_STS_CLKREADY_BIT)) {
264- dev_warn(dev, "clock is not stable yet\n");
265+ dev_err(dev, "clock is not stable\n");
266+ return -EAGAIN;
267 }
268 }
269
Jan Kundrátda819402023-12-02 11:20:56 +0100270@@ -1349,6 +1358,10 @@ static int max310x_probe(struct device *dev, const struct max310x_devtype *devty
Jan Kundráte7d21622019-03-28 22:52:38 +0100271 }
272
273 uartclk = max310x_set_ref_clk(dev, s, freq, xtal);
Jan Kundrát2bfe9ee2019-12-04 13:42:07 +0100274+ if (uartclk < 0) {
275+ ret = uartclk;
276+ goto out_uart;
277+ }
278 dev_dbg(dev, "Reference clock set to %i Hz\n", uartclk);
Jan Kundráte7d21622019-03-28 22:52:38 +0100279
Jan Kundrát2bfe9ee2019-12-04 13:42:07 +0100280 for (i = 0; i < devtype->nr; i++) {
Jan Kundrátda819402023-12-02 11:20:56 +0100281@@ -1485,6 +1498,15 @@ static struct regmap_config regcfg = {
282 .max_raw_write = MAX310X_FIFO_SIZE,
283 };
284
285+static const char *max310x_regmap_name(unsigned int port_id)
286+{
287+ static char buf[sizeof(MAX310X_PORT_NAME_SUFFIX __stringify(MAX310X_MAX_PORTS))];
288+
289+ snprintf(buf, sizeof(buf), MAX310X_PORT_NAME_SUFFIX "%u", port_id);
290+
291+ return buf;
292+}
293+
294 #ifdef CONFIG_SPI_MASTER
295 static int max310x_spi_extended_reg_enable(struct device *dev, bool enable)
296 {
297@@ -1502,7 +1524,7 @@ static const struct max310x_if_cfg __maybe_unused max310x_spi_if_cfg = {
298 static int max310x_spi_probe(struct spi_device *spi)
299 {
300 const struct max310x_devtype *devtype;
301- struct regmap *regmaps[4];
302+ struct regmap *regmaps[MAX310X_MAX_PORTS];
303 unsigned int i;
304 int ret;
305
306@@ -1520,6 +1542,8 @@ static int max310x_spi_probe(struct spi_device *spi)
307
308 for (i = 0; i < devtype->nr; i++) {
Jan Kundrát0ef140f2023-09-14 12:14:43 +0200309 u8 port_mask = i * 0x20;
Jan Kundrátda819402023-12-02 11:20:56 +0100310+
311+ regcfg.name = max310x_regmap_name(i);
Jan Kundrát0ef140f2023-09-14 12:14:43 +0200312 regcfg.read_flag_mask = port_mask;
313 regcfg.write_flag_mask = port_mask | MAX310X_WRITE_BIT;
Jan Kundrát0ef140f2023-09-14 12:14:43 +0200314 regmaps[i] = devm_regmap_init_spi(spi, &regcfg);
Jan Kundrátda819402023-12-02 11:20:56 +0100315@@ -1605,7 +1629,7 @@ static int max310x_i2c_probe(struct i2c_client *client)
316 const struct max310x_devtype *devtype =
317 device_get_match_data(&client->dev);
318 struct i2c_client *port_client;
319- struct regmap *regmaps[4];
320+ struct regmap *regmaps[MAX310X_MAX_PORTS];
321 unsigned int i;
322 u8 port_addr;
323
324@@ -1616,6 +1640,7 @@ static int max310x_i2c_probe(struct i2c_client *client)
325 client->addr, devtype->slave_addr.min,
326 devtype->slave_addr.max);
327
328+ regcfg_i2c.name = max310x_regmap_name(0);
329 regmaps[0] = devm_regmap_init_i2c(client, &regcfg_i2c);
330
331 for (i = 1; i < devtype->nr; i++) {
332@@ -1624,6 +1649,7 @@ static int max310x_i2c_probe(struct i2c_client *client)
333 client->adapter,
334 port_addr);
335
336+ regcfg_i2c.name = max310x_regmap_name(i);
337 regmaps[i] = devm_regmap_init_i2c(port_client, &regcfg_i2c);
Jan Kundrát0ef140f2023-09-14 12:14:43 +0200338 }
Jan Kundrát277991e2023-02-24 21:12:13 +0100339