xref: /linux-6.15/include/linux/ulpi/driver.h (revision e6ecc041)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2289fcff4SHeikki Krogerus #ifndef __LINUX_ULPI_DRIVER_H
3289fcff4SHeikki Krogerus #define __LINUX_ULPI_DRIVER_H
4289fcff4SHeikki Krogerus 
5289fcff4SHeikki Krogerus #include <linux/mod_devicetable.h>
6289fcff4SHeikki Krogerus 
7289fcff4SHeikki Krogerus #include <linux/device.h>
8289fcff4SHeikki Krogerus 
9289fcff4SHeikki Krogerus struct ulpi_ops;
10289fcff4SHeikki Krogerus 
11289fcff4SHeikki Krogerus /**
12289fcff4SHeikki Krogerus  * struct ulpi - describes ULPI PHY device
13289fcff4SHeikki Krogerus  * @id: vendor and product ids for ULPI device
14289fcff4SHeikki Krogerus  * @ops: I/O access
15289fcff4SHeikki Krogerus  * @dev: device interface
16289fcff4SHeikki Krogerus  */
17289fcff4SHeikki Krogerus struct ulpi {
18*e6ecc041SAndy Shevchenko 	struct device dev;
19289fcff4SHeikki Krogerus 	struct ulpi_device_id id;
20b9454f90STal Shorer 	const struct ulpi_ops *ops;
21289fcff4SHeikki Krogerus };
22289fcff4SHeikki Krogerus 
23289fcff4SHeikki Krogerus #define to_ulpi_dev(d) container_of(d, struct ulpi, dev)
24289fcff4SHeikki Krogerus 
ulpi_set_drvdata(struct ulpi * ulpi,void * data)25289fcff4SHeikki Krogerus static inline void ulpi_set_drvdata(struct ulpi *ulpi, void *data)
26289fcff4SHeikki Krogerus {
27289fcff4SHeikki Krogerus 	dev_set_drvdata(&ulpi->dev, data);
28289fcff4SHeikki Krogerus }
29289fcff4SHeikki Krogerus 
ulpi_get_drvdata(struct ulpi * ulpi)30289fcff4SHeikki Krogerus static inline void *ulpi_get_drvdata(struct ulpi *ulpi)
31289fcff4SHeikki Krogerus {
32289fcff4SHeikki Krogerus 	return dev_get_drvdata(&ulpi->dev);
33289fcff4SHeikki Krogerus }
34289fcff4SHeikki Krogerus 
35289fcff4SHeikki Krogerus /**
36289fcff4SHeikki Krogerus  * struct ulpi_driver - describes a ULPI PHY driver
37289fcff4SHeikki Krogerus  * @id_table: array of device identifiers supported by this driver
38289fcff4SHeikki Krogerus  * @probe: binds this driver to ULPI device
39289fcff4SHeikki Krogerus  * @remove: unbinds this driver from ULPI device
40289fcff4SHeikki Krogerus  * @driver: the name and owner members must be initialized by the drivers
41289fcff4SHeikki Krogerus  */
42289fcff4SHeikki Krogerus struct ulpi_driver {
43289fcff4SHeikki Krogerus 	const struct ulpi_device_id *id_table;
44289fcff4SHeikki Krogerus 	int (*probe)(struct ulpi *ulpi);
45289fcff4SHeikki Krogerus 	void (*remove)(struct ulpi *ulpi);
46289fcff4SHeikki Krogerus 	struct device_driver driver;
47289fcff4SHeikki Krogerus };
48289fcff4SHeikki Krogerus 
49289fcff4SHeikki Krogerus #define to_ulpi_driver(d) container_of(d, struct ulpi_driver, driver)
50289fcff4SHeikki Krogerus 
511ebe88d3SStephen Boyd /*
521ebe88d3SStephen Boyd  * use a macro to avoid include chaining to get THIS_MODULE
531ebe88d3SStephen Boyd  */
541ebe88d3SStephen Boyd #define ulpi_register_driver(drv) __ulpi_register_driver(drv, THIS_MODULE)
551ebe88d3SStephen Boyd int __ulpi_register_driver(struct ulpi_driver *drv, struct module *module);
56289fcff4SHeikki Krogerus void ulpi_unregister_driver(struct ulpi_driver *drv);
57289fcff4SHeikki Krogerus 
58289fcff4SHeikki Krogerus #define module_ulpi_driver(__ulpi_driver) \
59289fcff4SHeikki Krogerus 	module_driver(__ulpi_driver, ulpi_register_driver, \
60289fcff4SHeikki Krogerus 		      ulpi_unregister_driver)
61289fcff4SHeikki Krogerus 
62289fcff4SHeikki Krogerus int ulpi_read(struct ulpi *ulpi, u8 addr);
63289fcff4SHeikki Krogerus int ulpi_write(struct ulpi *ulpi, u8 addr, u8 val);
64289fcff4SHeikki Krogerus 
65289fcff4SHeikki Krogerus #endif /* __LINUX_ULPI_DRIVER_H */
66