1 // SPDX-License-Identifier: GPL-2.0-only
3 * ST Microelectronics MFD: stmpe's spi client specific driver
5 * Copyright (C) ST Microelectronics SA 2011
7 * Author: Viresh Kumar <vireshk@kernel.org> for ST Microelectronics
10 #include <linux/spi/spi.h>
11 #include <linux/interrupt.h>
12 #include <linux/kernel.h>
13 #include <linux/module.h>
15 #include <linux/types.h>
18 #define READ_CMD (1 << 7)
20 static int spi_reg_read(struct stmpe
*stmpe
, u8 reg
)
22 struct spi_device
*spi
= stmpe
->client
;
23 int status
= spi_w8r16(spi
, reg
| READ_CMD
);
25 return (status
< 0) ? status
: status
>> 8;
28 static int spi_reg_write(struct stmpe
*stmpe
, u8 reg
, u8 val
)
30 struct spi_device
*spi
= stmpe
->client
;
31 u16 cmd
= (val
<< 8) | reg
;
33 return spi_write(spi
, (const u8
*)&cmd
, 2);
36 static int spi_block_read(struct stmpe
*stmpe
, u8 reg
, u8 length
, u8
*values
)
40 for (i
= 0; i
< length
; i
++) {
41 ret
= spi_reg_read(stmpe
, reg
+ i
);
50 static int spi_block_write(struct stmpe
*stmpe
, u8 reg
, u8 length
,
55 for (i
= length
; i
> 0; i
--, reg
++) {
56 ret
= spi_reg_write(stmpe
, reg
, *(values
+ i
- 1));
64 static void spi_init(struct stmpe
*stmpe
)
66 struct spi_device
*spi
= stmpe
->client
;
68 spi
->bits_per_word
= 8;
70 /* This register is only present for stmpe811 */
71 if (stmpe
->variant
->id_val
== 0x0811)
72 spi_reg_write(stmpe
, STMPE811_REG_SPI_CFG
, spi
->mode
);
74 if (spi_setup(spi
) < 0)
75 dev_dbg(&spi
->dev
, "spi_setup failed\n");
78 static struct stmpe_client_info spi_ci
= {
79 .read_byte
= spi_reg_read
,
80 .write_byte
= spi_reg_write
,
81 .read_block
= spi_block_read
,
82 .write_block
= spi_block_write
,
87 stmpe_spi_probe(struct spi_device
*spi
)
89 const struct spi_device_id
*id
= spi_get_device_id(spi
);
91 /* don't exceed max specified rate - 1MHz - Limitation of STMPE */
92 if (spi
->max_speed_hz
> 1000000) {
93 dev_dbg(&spi
->dev
, "f(sample) %d KHz?\n",
94 (spi
->max_speed_hz
/1000));
98 spi_ci
.irq
= spi
->irq
;
100 spi_ci
.dev
= &spi
->dev
;
102 return stmpe_probe(&spi_ci
, id
->driver_data
);
105 static int stmpe_spi_remove(struct spi_device
*spi
)
107 struct stmpe
*stmpe
= spi_get_drvdata(spi
);
109 return stmpe_remove(stmpe
);
112 static const struct of_device_id stmpe_spi_of_match
[] = {
113 { .compatible
= "st,stmpe610", },
114 { .compatible
= "st,stmpe801", },
115 { .compatible
= "st,stmpe811", },
116 { .compatible
= "st,stmpe1601", },
117 { .compatible
= "st,stmpe2401", },
118 { .compatible
= "st,stmpe2403", },
121 MODULE_DEVICE_TABLE(of
, stmpe_spi_of_match
);
123 static const struct spi_device_id stmpe_spi_id
[] = {
124 { "stmpe610", STMPE610
},
125 { "stmpe801", STMPE801
},
126 { "stmpe811", STMPE811
},
127 { "stmpe1601", STMPE1601
},
128 { "stmpe2401", STMPE2401
},
129 { "stmpe2403", STMPE2403
},
132 MODULE_DEVICE_TABLE(spi
, stmpe_id
);
134 static struct spi_driver stmpe_spi_driver
= {
137 .of_match_table
= of_match_ptr(stmpe_spi_of_match
),
139 .pm
= &stmpe_dev_pm_ops
,
142 .probe
= stmpe_spi_probe
,
143 .remove
= stmpe_spi_remove
,
144 .id_table
= stmpe_spi_id
,
147 static int __init
stmpe_init(void)
149 return spi_register_driver(&stmpe_spi_driver
);
151 subsys_initcall(stmpe_init
);
153 static void __exit
stmpe_exit(void)
155 spi_unregister_driver(&stmpe_spi_driver
);
157 module_exit(stmpe_exit
);
159 MODULE_LICENSE("GPL v2");
160 MODULE_DESCRIPTION("STMPE MFD SPI Interface Driver");
161 MODULE_AUTHOR("Viresh Kumar <vireshk@kernel.org>");