xref: /openbmc/linux/include/linux/sm501.h (revision 0b712183)
10b712183SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2b6d6454fSBen Dooks /* include/linux/sm501.h
3b6d6454fSBen Dooks  *
4b6d6454fSBen Dooks  * Copyright (c) 2006 Simtec Electronics
5b6d6454fSBen Dooks  *	Ben Dooks <ben@simtec.co.uk>
6b6d6454fSBen Dooks  *	Vincent Sanders <vince@simtec.co.uk>
7b6d6454fSBen Dooks */
8b6d6454fSBen Dooks 
9b6d6454fSBen Dooks extern int sm501_unit_power(struct device *dev,
10b6d6454fSBen Dooks 			    unsigned int unit, unsigned int to);
11b6d6454fSBen Dooks 
12b6d6454fSBen Dooks extern unsigned long sm501_set_clock(struct device *dev,
13b6d6454fSBen Dooks 				     int clksrc, unsigned long freq);
14b6d6454fSBen Dooks 
153149be50SVille Syrjala extern unsigned long sm501_find_clock(struct device *dev,
163149be50SVille Syrjala 				      int clksrc, unsigned long req_freq);
17b6d6454fSBen Dooks 
18b6d6454fSBen Dooks /* sm501_misc_control
19b6d6454fSBen Dooks  *
20b6d6454fSBen Dooks  * Modify the SM501's MISC_CONTROL register
21b6d6454fSBen Dooks */
22b6d6454fSBen Dooks 
23b6d6454fSBen Dooks extern int sm501_misc_control(struct device *dev,
24b6d6454fSBen Dooks 			      unsigned long set, unsigned long clear);
25b6d6454fSBen Dooks 
26b6d6454fSBen Dooks /* sm501_modify_reg
27b6d6454fSBen Dooks  *
28b6d6454fSBen Dooks  * Modify a register in the SM501 which may be shared with other
29b6d6454fSBen Dooks  * drivers.
30b6d6454fSBen Dooks */
31b6d6454fSBen Dooks 
32b6d6454fSBen Dooks extern unsigned long sm501_modify_reg(struct device *dev,
33b6d6454fSBen Dooks 				      unsigned long reg,
34b6d6454fSBen Dooks 				      unsigned long set,
35b6d6454fSBen Dooks 				      unsigned long clear);
36b6d6454fSBen Dooks 
37b6d6454fSBen Dooks 
38b6d6454fSBen Dooks /* Platform data definitions */
39b6d6454fSBen Dooks 
40b6d6454fSBen Dooks #define SM501FB_FLAG_USE_INIT_MODE	(1<<0)
41b6d6454fSBen Dooks #define SM501FB_FLAG_DISABLE_AT_EXIT	(1<<1)
42b6d6454fSBen Dooks #define SM501FB_FLAG_USE_HWCURSOR	(1<<2)
43b6d6454fSBen Dooks #define SM501FB_FLAG_USE_HWACCEL	(1<<3)
44cdc83ae2SBen Dooks #define SM501FB_FLAG_PANEL_NO_FPEN	(1<<4)
45cdc83ae2SBen Dooks #define SM501FB_FLAG_PANEL_NO_VBIASEN	(1<<5)
46206c5d69SBen Dooks #define SM501FB_FLAG_PANEL_INV_FPEN	(1<<6)
47206c5d69SBen Dooks #define SM501FB_FLAG_PANEL_INV_VBIASEN	(1<<7)
48b6d6454fSBen Dooks 
49b6d6454fSBen Dooks struct sm501_platdata_fbsub {
50b6d6454fSBen Dooks 	struct fb_videomode	*def_mode;
51b6d6454fSBen Dooks 	unsigned int		 def_bpp;
52b6d6454fSBen Dooks 	unsigned long		 max_mem;
53b6d6454fSBen Dooks 	unsigned int		 flags;
54b6d6454fSBen Dooks };
55b6d6454fSBen Dooks 
56b6d6454fSBen Dooks enum sm501_fb_routing {
57b6d6454fSBen Dooks 	SM501_FB_OWN		= 0,	/* CRT=>CRT, Panel=>Panel */
58b6d6454fSBen Dooks 	SM501_FB_CRT_PANEL	= 1,	/* Panel=>CRT, Panel=>Panel */
59b6d6454fSBen Dooks };
60b6d6454fSBen Dooks 
61b6d6454fSBen Dooks /* sm501_platdata_fb flag field bit definitions */
62b6d6454fSBen Dooks 
63b6d6454fSBen Dooks #define SM501_FBPD_SWAP_FB_ENDIAN	(1<<0)	/* need to endian swap */
64b6d6454fSBen Dooks 
65b6d6454fSBen Dooks /* sm501_platdata_fb
66b6d6454fSBen Dooks  *
67b6d6454fSBen Dooks  * configuration data for the framebuffer driver
68b6d6454fSBen Dooks */
69b6d6454fSBen Dooks 
70b6d6454fSBen Dooks struct sm501_platdata_fb {
71b6d6454fSBen Dooks 	enum sm501_fb_routing		 fb_route;
72b6d6454fSBen Dooks 	unsigned int			 flags;
73b6d6454fSBen Dooks 	struct sm501_platdata_fbsub	*fb_crt;
74b6d6454fSBen Dooks 	struct sm501_platdata_fbsub	*fb_pnl;
75b6d6454fSBen Dooks };
76b6d6454fSBen Dooks 
7742cd2366SBen Dooks /* gpio i2c
7842cd2366SBen Dooks  *
7942cd2366SBen Dooks  * Note, we have to pass in the bus number, as the number used will be
8042cd2366SBen Dooks  * passed to the i2c-gpio driver's platform_device.id, subsequently used
8142cd2366SBen Dooks  * to register the i2c bus.
8242cd2366SBen Dooks */
83b6d6454fSBen Dooks 
84b6d6454fSBen Dooks struct sm501_platdata_gpio_i2c {
8542cd2366SBen Dooks 	unsigned int		bus_num;
86b6d6454fSBen Dooks 	unsigned int		pin_sda;
87b6d6454fSBen Dooks 	unsigned int		pin_scl;
8842cd2366SBen Dooks 	int			udelay;
8942cd2366SBen Dooks 	int			timeout;
90b6d6454fSBen Dooks };
91b6d6454fSBen Dooks 
92b6d6454fSBen Dooks /* sm501_initdata
93b6d6454fSBen Dooks  *
94b6d6454fSBen Dooks  * use for initialising values that may not have been setup
95b6d6454fSBen Dooks  * before the driver is loaded.
96b6d6454fSBen Dooks */
97b6d6454fSBen Dooks 
98b6d6454fSBen Dooks struct sm501_reg_init {
99b6d6454fSBen Dooks 	unsigned long		set;
100b6d6454fSBen Dooks 	unsigned long		mask;
101b6d6454fSBen Dooks };
102b6d6454fSBen Dooks 
103b6d6454fSBen Dooks #define SM501_USE_USB_HOST	(1<<0)
104b6d6454fSBen Dooks #define SM501_USE_USB_SLAVE	(1<<1)
105b6d6454fSBen Dooks #define SM501_USE_SSP0		(1<<2)
106b6d6454fSBen Dooks #define SM501_USE_SSP1		(1<<3)
107b6d6454fSBen Dooks #define SM501_USE_UART0		(1<<4)
108b6d6454fSBen Dooks #define SM501_USE_UART1		(1<<5)
109b6d6454fSBen Dooks #define SM501_USE_FBACCEL	(1<<6)
110b6d6454fSBen Dooks #define SM501_USE_AC97		(1<<7)
111b6d6454fSBen Dooks #define SM501_USE_I2S		(1<<8)
112f61be273SBen Dooks #define SM501_USE_GPIO		(1<<9)
113b6d6454fSBen Dooks 
114b6d6454fSBen Dooks #define SM501_USE_ALL		(0xffffffff)
115b6d6454fSBen Dooks 
116b6d6454fSBen Dooks struct sm501_initdata {
117b6d6454fSBen Dooks 	struct sm501_reg_init	gpio_low;
118b6d6454fSBen Dooks 	struct sm501_reg_init	gpio_high;
119b6d6454fSBen Dooks 	struct sm501_reg_init	misc_timing;
120b6d6454fSBen Dooks 	struct sm501_reg_init	misc_control;
121b6d6454fSBen Dooks 
122b6d6454fSBen Dooks 	unsigned long		devices;
123b6d6454fSBen Dooks 	unsigned long		mclk;		/* non-zero to modify */
124b6d6454fSBen Dooks 	unsigned long		m1xclk;		/* non-zero to modify */
125b6d6454fSBen Dooks };
126b6d6454fSBen Dooks 
127b6d6454fSBen Dooks /* sm501_init_gpio
128b6d6454fSBen Dooks  *
129b6d6454fSBen Dooks  * default gpio settings
130b6d6454fSBen Dooks */
131b6d6454fSBen Dooks 
132b6d6454fSBen Dooks struct sm501_init_gpio {
133b6d6454fSBen Dooks 	struct sm501_reg_init	gpio_data_low;
134b6d6454fSBen Dooks 	struct sm501_reg_init	gpio_data_high;
135b6d6454fSBen Dooks 	struct sm501_reg_init	gpio_ddr_low;
136b6d6454fSBen Dooks 	struct sm501_reg_init	gpio_ddr_high;
137b6d6454fSBen Dooks };
138b6d6454fSBen Dooks 
139472dba7dSBen Dooks #define SM501_FLAG_SUSPEND_OFF		(1<<4)
140472dba7dSBen Dooks 
141b6d6454fSBen Dooks /* sm501_platdata
142b6d6454fSBen Dooks  *
143b6d6454fSBen Dooks  * This is passed with the platform device to allow the board
144b6d6454fSBen Dooks  * to control the behaviour of the SM501 driver(s) which attach
145b6d6454fSBen Dooks  * to the device.
146b6d6454fSBen Dooks  *
147b6d6454fSBen Dooks */
148b6d6454fSBen Dooks 
149b6d6454fSBen Dooks struct sm501_platdata {
150b6d6454fSBen Dooks 	struct sm501_initdata		*init;
151b6d6454fSBen Dooks 	struct sm501_init_gpio		*init_gpiop;
152b6d6454fSBen Dooks 	struct sm501_platdata_fb	*fb;
153b6d6454fSBen Dooks 
154472dba7dSBen Dooks 	int				 flags;
15560e540d6SArnaud Patard 	int				 gpio_base;
156472dba7dSBen Dooks 
157472dba7dSBen Dooks 	int	(*get_power)(struct device *dev);
158472dba7dSBen Dooks 	int	(*set_power)(struct device *dev, unsigned int on);
159472dba7dSBen Dooks 
160b6d6454fSBen Dooks 	struct sm501_platdata_gpio_i2c	*gpio_i2c;
161b6d6454fSBen Dooks 	unsigned int			 gpio_i2c_nr;
162b6d6454fSBen Dooks };
163bf5f0019SHeiko Schocher 
164bf5f0019SHeiko Schocher #if defined(CONFIG_PPC32)
165bf5f0019SHeiko Schocher #define smc501_readl(addr)		ioread32be((addr))
166bf5f0019SHeiko Schocher #define smc501_writel(val, addr)	iowrite32be((val), (addr))
167bf5f0019SHeiko Schocher #else
168bf5f0019SHeiko Schocher #define smc501_readl(addr)		readl(addr)
169bf5f0019SHeiko Schocher #define smc501_writel(val, addr)	writel(val, addr)
170bf5f0019SHeiko Schocher #endif
171