6
6
*/
7
7
8
8
#include <linux/delay.h>
9
+ #include <linux/gpio/consumer.h>
9
10
#include <linux/lcd.h>
10
11
#include <linux/module.h>
11
12
#include <linux/of.h>
12
13
#include <linux/of_device.h>
13
- #include <linux/of_gpio.h>
14
14
#include <linux/spi/spi.h>
15
15
16
16
#define HX8357_NUM_IM_PINS 3
83
83
#define HX8369_SET_GAMMA_CURVE_RELATED 0xe0
84
84
85
85
struct hx8357_data {
86
- unsigned im_pins [ HX8357_NUM_IM_PINS ] ;
87
- unsigned reset ;
86
+ struct gpio_descs * im_pins ;
87
+ struct gpio_desc * reset ;
88
88
struct spi_device * spi ;
89
89
int state ;
90
- bool use_im_pins ;
91
90
};
92
91
93
92
static u8 hx8357_seq_power [] = {
@@ -321,11 +320,11 @@ static void hx8357_lcd_reset(struct lcd_device *lcdev)
321
320
struct hx8357_data * lcd = lcd_get_data (lcdev );
322
321
323
322
/* Reset the screen */
324
- gpio_set_value (lcd -> reset , 1 );
323
+ gpiod_set_value (lcd -> reset , 0 );
325
324
usleep_range (10000 , 12000 );
326
- gpio_set_value (lcd -> reset , 0 );
325
+ gpiod_set_value (lcd -> reset , 1 );
327
326
usleep_range (10000 , 12000 );
328
- gpio_set_value (lcd -> reset , 1 );
327
+ gpiod_set_value (lcd -> reset , 0 );
329
328
330
329
/* The controller needs 120ms to recover from reset */
331
330
msleep (120 );
@@ -340,10 +339,10 @@ static int hx8357_lcd_init(struct lcd_device *lcdev)
340
339
* Set the interface selection pins to SPI mode, with three
341
340
* wires
342
341
*/
343
- if (lcd -> use_im_pins ) {
344
- gpio_set_value_cansleep (lcd -> im_pins [0 ], 1 );
345
- gpio_set_value_cansleep (lcd -> im_pins [1 ], 0 );
346
- gpio_set_value_cansleep (lcd -> im_pins [2 ], 1 );
342
+ if (lcd -> im_pins ) {
343
+ gpiod_set_value_cansleep (lcd -> im_pins -> desc [0 ], 1 );
344
+ gpiod_set_value_cansleep (lcd -> im_pins -> desc [1 ], 0 );
345
+ gpiod_set_value_cansleep (lcd -> im_pins -> desc [2 ], 1 );
347
346
}
348
347
349
348
ret = hx8357_spi_write_array (lcdev , hx8357_seq_power ,
@@ -580,6 +579,7 @@ MODULE_DEVICE_TABLE(of, hx8357_dt_ids);
580
579
581
580
static int hx8357_probe (struct spi_device * spi )
582
581
{
582
+ struct device * dev = & spi -> dev ;
583
583
struct lcd_device * lcdev ;
584
584
struct hx8357_data * lcd ;
585
585
const struct of_device_id * match ;
@@ -601,49 +601,19 @@ static int hx8357_probe(struct spi_device *spi)
601
601
if (!match || !match -> data )
602
602
return - EINVAL ;
603
603
604
- lcd -> reset = of_get_named_gpio (spi -> dev .of_node , "gpios-reset" , 0 );
605
- if (!gpio_is_valid (lcd -> reset )) {
606
- dev_err (& spi -> dev , "Missing dt property: gpios-reset\n" );
607
- return - EINVAL ;
608
- }
604
+ lcd -> reset = devm_gpiod_get (dev , "reset" , GPIOD_OUT_LOW );
605
+ if (IS_ERR (lcd -> reset ))
606
+ return dev_err_probe (dev , PTR_ERR (lcd -> reset ), "failed to request reset GPIO\n" );
607
+ gpiod_set_consumer_name (lcd -> reset , "hx8357-reset" );
609
608
610
- ret = devm_gpio_request_one (& spi -> dev , lcd -> reset ,
611
- GPIOF_OUT_INIT_HIGH ,
612
- "hx8357-reset" );
613
- if (ret ) {
614
- dev_err (& spi -> dev ,
615
- "failed to request gpio %d: %d\n" ,
616
- lcd -> reset , ret );
617
- return - EINVAL ;
618
- }
609
+ lcd -> im_pins = devm_gpiod_get_array_optional (dev , "im" , GPIOD_OUT_LOW );
610
+ if (IS_ERR (lcd -> im_pins ))
611
+ return dev_err_probe (dev , PTR_ERR (lcd -> im_pins ), "failed to request im GPIOs\n" );
612
+ if (lcd -> im_pins -> ndescs < HX8357_NUM_IM_PINS )
613
+ return dev_err_probe (dev , - EINVAL , "not enough im GPIOs\n" );
619
614
620
- if (of_property_present (spi -> dev .of_node , "im-gpios" )) {
621
- lcd -> use_im_pins = 1 ;
622
-
623
- for (i = 0 ; i < HX8357_NUM_IM_PINS ; i ++ ) {
624
- lcd -> im_pins [i ] = of_get_named_gpio (spi -> dev .of_node ,
625
- "im-gpios" , i );
626
- if (lcd -> im_pins [i ] == - EPROBE_DEFER ) {
627
- dev_info (& spi -> dev , "GPIO requested is not here yet, deferring the probe\n" );
628
- return - EPROBE_DEFER ;
629
- }
630
- if (!gpio_is_valid (lcd -> im_pins [i ])) {
631
- dev_err (& spi -> dev , "Missing dt property: im-gpios\n" );
632
- return - EINVAL ;
633
- }
634
-
635
- ret = devm_gpio_request_one (& spi -> dev , lcd -> im_pins [i ],
636
- GPIOF_OUT_INIT_LOW ,
637
- "im_pins" );
638
- if (ret ) {
639
- dev_err (& spi -> dev , "failed to request gpio %d: %d\n" ,
640
- lcd -> im_pins [i ], ret );
641
- return - EINVAL ;
642
- }
643
- }
644
- } else {
645
- lcd -> use_im_pins = 0 ;
646
- }
615
+ for (i = 0 ; i < HX8357_NUM_IM_PINS ; i ++ )
616
+ gpiod_set_consumer_name (lcd -> im_pins -> desc [i ], "im_pins" );
647
617
648
618
lcdev = devm_lcd_device_register (& spi -> dev , "mxsfb" , & spi -> dev , lcd ,
649
619
& hx8357_ops );
0 commit comments