gpio_export_with_name

内核目录下 /sys/class/gpio 下实现

 .../arm64/configs/aeon6737t_66_d_n_debug_defconfig |   1 +
 arch/arm64/configs/aeon6737t_66_d_n_defconfig      |   1 +
 drivers/gpio/gpiolib-sysfs.c                       | 105 +++++++++++++++++++++
 drivers/misc/mediatek/aeondws/codegen_F515.dws     | Bin 30503 -> 30060 bytes
 drivers/misc/mediatek/gpio/aeon_gpio.c             |  65 ++++++++++++-
 include/asm-generic/gpio.h                         |   9 +-
 include/linux/gpio.h                               |   8 ++
 tools/dct/old_dct/Keypad_YuSu.cmp                  |   2 +-
 8 files changed, 188 insertions(+), 3 deletions(-)
 mode change 100755 => 100644 drivers/misc/mediatek/aeondws/codegen_F515.dws

diff --git a/arch/arm64/configs/aeon6737t_66_d_n_debug_defconfig b/arch/arm64/configs/aeon6737t_66_d_n_debug_defconfig
index ae29cfb..aeba932 100755
--- a/arch/arm64/configs/aeon6737t_66_d_n_debug_defconfig
+++ b/arch/arm64/configs/aeon6737t_66_d_n_debug_defconfig
@@ -328,6 +328,7 @@ CONFIG_INPUT_UINPUT=y
 CONFIG_LEGACY_PTY_COUNT=16
 # CONFIG_HW_RANDOM is not set
 CONFIG_I2C=y
+CONFIG_I2C_CHARDEV=y
 CONFIG_SPI=y
 CONFIG_MTK_SPI=y
 CONFIG_MTK_SMART_BATTERY=y
diff --git a/arch/arm64/configs/aeon6737t_66_d_n_defconfig b/arch/arm64/configs/aeon6737t_66_d_n_defconfig
index 182fefc..e515d9f 100755
--- a/arch/arm64/configs/aeon6737t_66_d_n_defconfig
+++ b/arch/arm64/configs/aeon6737t_66_d_n_defconfig
@@ -318,6 +318,7 @@ CONFIG_LEGACY_PTY_COUNT=16
 # CONFIG_DEVKMEM is not set
 # CONFIG_HW_RANDOM is not set
 CONFIG_I2C=y
+CONFIG_I2C_CHARDEV=y
 CONFIG_SPI=y
 CONFIG_MTK_SPI=y
 CONFIG_MTK_SMART_BATTERY=y
diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c
index d9fa798..3d53960 100644
--- a/drivers/gpio/gpiolib-sysfs.c
+++ b/drivers/gpio/gpiolib-sysfs.c
@@ -604,6 +604,111 @@ fail_unlock:
 }
 EXPORT_SYMBOL_GPL(gpiod_export);
 
+/**
+ * gpiod_export_with_name - export a GPIO through sysfs
+ * @gpio: gpio to make available, already requested
+ * @direction_may_change: true if userspace may change gpio direction
+ * @name: gpio name
+ * Context: arch_initcall or later
+ *
+ * When drivers want to make a GPIO accessible to userspace after they
+ * have requested it -- perhaps while debugging, or as part of their
+ * public interface -- they may use this routine.  If the GPIO can
+ * change direction (some can't) and the caller allows it, userspace
+ * will see "direction" sysfs attribute which may be used to change
+ * the gpio's direction.  A "value" attribute will always be provided.
+ *
+ * Returns zero on success, else an error.
+ */
+int gpiod_export_with_name(struct gpio_desc *desc, bool direction_may_change,
+                            const char *name)
+{
+	struct gpio_chip	*chip;
+	unsigned long		flags;
+	int			status;
+	const char		*ioname = NULL;
+	struct device		*dev;
+	int			offset;
+
+	/* can't export until sysfs is available ... */
+	if (!gpio_class.p) {
+		pr_debug("%s: called too early!\n", __func__);
+		return -ENOENT;
+	}
+
+	if (!desc) {
+		pr_debug("%s: invalid gpio descriptor\n", __func__);
+		return -EINVAL;
+	}
+
+	chip = desc->chip;
+
+	mutex_lock(&sysfs_lock);
+
+	/* check if chip is being removed */
+	if (!chip || !chip->exported) {
+		status = -ENODEV;
+		goto fail_unlock;
+	}
+
+	spin_lock_irqsave(&gpio_lock, flags);
+	if (!test_bit(FLAG_REQUESTED, &desc->flags) ||
+	     test_bit(FLAG_EXPORT, &desc->flags)) {
+		spin_unlock_irqrestore(&gpio_lock, flags);
+		gpiod_dbg(desc, "%s: unavailable (requested=%d, exported=%d)\n",
+				__func__,
+				test_bit(FLAG_REQUESTED, &desc->flags),
+				test_bit(FLAG_EXPORT, &desc->flags));
+		status = -EPERM;
+		goto fail_unlock;
+	}
+
+	if (!desc->chip->direction_input || !desc->chip->direction_output)
+		direction_may_change = false;
+	spin_unlock_irqrestore(&gpio_lock, flags);
+
+	offset = gpio_chip_hwgpio(desc);
+	//if (desc->chip->names && desc->chip->names[offset])
+	//	ioname = desc->chip->names[offset];
+	ioname = name;
+
+	dev = device_create_with_groups(&gpio_class, desc->chip->dev,
+					MKDEV(0, 0), desc, gpio_groups,
+					ioname ? ioname : "gpio%u",
+					desc_to_gpio(desc));
+	if (IS_ERR(dev)) {
+		status = PTR_ERR(dev);
+		goto fail_unlock;
+	}
+
+	if (direction_may_change) {
+		status = device_create_file(dev, &dev_attr_direction);
+		if (status)
+			goto fail_unregister_device;
+	}
+
+	if (gpiod_to_irq(desc) >= 0 && (direction_may_change ||
+				       !test_bit(FLAG_IS_OUT, &desc->flags))) {
+		status = device_create_file(dev, &dev_attr_edge);
+		if (status)
+			goto fail_remove_attr_direction;
+	}
+
+	set_bit(FLAG_EXPORT, &desc->flags);
+	mutex_unlock(&sysfs_lock);
+	return 0;
+
+fail_remove_attr_direction:
+	device_remove_file(dev, &dev_attr_direction);
+fail_unregister_device:
+	device_unregister(dev);
+fail_unlock:
+	mutex_unlock(&sysfs_lock);
+	gpiod_dbg(desc, "%s: status %d\n", __func__, status);
+	return status;
+}
+EXPORT_SYMBOL_GPL(gpiod_export_with_name);
+
 static int match_export(struct device *dev, const void *data)
 {
 	return dev_get_drvdata(dev) == data;
diff --git a/drivers/misc/mediatek/aeondws/codegen_F515.dws b/drivers/misc/mediatek/aeondws/codegen_F515.dws
old mode 100755
new mode 100644
index 098b37bc7435588e385ec4a2d6327ac009e0d587..1dc4dff9c9d0352af33350c2b554529f3402783f
GIT binary patch
delta 2634
zcmb_eUu;ul6z}bB+uLy+ck5l-&DP#+g@G-ue?|w&x?9=}M%T3)9Sk$<2u32{K(`WN
zh}o-&M8+@1gdmANsPRE-t|l5VEXMd`OnDdNK_C2w3r~i`;Q8)t#~m397@B<TJ>NOs
z`SbgJ=iGjDi~I9;&YR1O@8c{Mi%iQwD_2bP#kX31z@gSIEZPN}*l0t}?SjM$sCv9u
za!ld`7hF*Jn#zmaT$YJ1cZ!%-1t@}un?p`4a?fKa;ah3#!Q~z&E_4T=lCyixc^uoQ
z;LQOUCsi-G;4$sCLG?TS$G#8#wqB@q!F`uLthyFjy9&ekQo2|u4I;IndyViCr6ANQ
zVQKK%yS51{XU8EmKq?6Zdw5x5h6)si%<(4u4lE{QM4Vn!+=ABB_^}n!NkYXPWE*H|
zoY!L*dp_OhmN?Zw5K4&Hc{oEd<^>5$oUmS8&OMh&6(hLDdrdgW_vxc+=?m$REQ-yW
zA@%uCO$+B8JkAI*3xn^QLwa!xezmWFiYu(W)3V1(`Ow7&WK<O%cjerDayQW0Sv$zC
zUxMV2ko7xpr}cFxcG09$XupMvVXQM~+GT{1Nwc0WPG-zX16p<@zSfaAnj3s3M8pME
z#7_=0NOdx;Lw~@D54>F_^G*2s$*DR=%@j7sF5}=+0+s^83VItlWkC(<JrVH;I6J_2
zW9E)Xv`|p7GZ!MR$7Pn-al6k{yM#qoo3N*t+Eps%_L{0>wVRdcY)vUZb%^*TMh4U)
zH$ok?)0yEF22X^T2Lsxw%UL(d-xq@2$a7FrGA{Uct$JJ0<r6IKCI2&A6z^L{FfbtC
zh9uyMTV8luTv0u%xIYlCVQe5$vG2feLPQ}Y;;&BcLWQoRqY0ggm-?o|?jpu7Lw8=;
z04RP;CMEQQ1=vEHu%z_ruob8|sx|>vQwlkVnV@8HGk)%9)$fxLkJ(Nq1>MJ&F=|^k
zk&|bGh6c>qdd`XzB~`VF=<nL`NYYr+qenE(J*;Gd+48YSs3a6>a*0Sn%wyA9=4|*p
z;i1XM<9ernuVd7)G-Zr2|7cogh}i!)oHqA)C`%)udrm2NnP8Ob6RMWtYTJjyE?f-l
zW7!-I%V-Qw7>@_3Hj(2n9roata2viNI4Uk5wr^1$@J!P>v59QhJP*<YC%OzuxY`re
zp?sKUeWpq}sD=w_S7O>3L7>-Ogxt_<T|-u=bBxi?>-LJ>3&vd5>X&<HWV=L;`oI-j
z=Jr3!-i)g>EEZb5tSPTh!?AGxwh2UfCkifCtumi>J${^n;w9YUU(`xwvx?WwZp}H*
zrxoo^($CQ^?j%JmtzHtj21HX`G$%wNlz?-p-yJKZa~TVJznZ=pYOg`#zrf9OhmFie
zvf8zgc@EBeOCYw*Vy6@PhV!dF;o1BfI5#$n-a-p!)y5|0teW(~X)AUXJhgSZiM<mC
zCyS+>6X|RzkJEXTY(8ty&W*juAv-lj4z_FAsc#!a4_W3i(bC@GTolP8J=`{J%aH-j
z!PEXwv=`To4&&s}PfTk<Yd`iO*I^@r(fsJ3g~iGiGNsH&DLZ%|W~nRi$MK<HUC^zD
zQt4uT`~Wkv)cjkV77NNVVVQm{v|q~P_m9?<n3`!vb;gZfUm0*RObYq^gX3Cw<~!aR
zjo|icJ!mZl8Y6nh$mw_*7iXWw>|7Wxm4ntu25*(y@nc!w66h~)Bxbxf=VNkXBBF;F
z9ZKWXa+@`_4ZqEWMV3MxG(=Ceb338TcH`4i+gDkI&Aa!P()rQicz(pPj!r&U{13Yc
B3G@H}

delta 3032
zcmZ`*O>7%g5caxuvaapKjyLhzaZ|@}f8(^a<2Xh_X`EgEwf64TyH1lfXniQqLQ{pb
zR22u(p1Aaoc*KoXjgUYbkkT3?4uFcp1*w7vRR{#CB5{MNN)OynVcvSzj`L$_?YD2f
znKy6dd*Ac3zo<{2Q@#>ko~BGD6N3+pPf1CRkB*g0k0E9q0?BFvXQ&e%b+TR-tvRV6
zs-lup3p`)QshNVHz>7Wx*1e9Jhk?x#PWUF|U0JrUJ_F6AOPO+7%@)&gUd;#^T=KCi
z%iXZx?m)N))_pYeQ+aK*hCAF!*<hJEPfYF}Bb1Qk)ai^crNxL2q+qgx_Wy?;vH_2Q
zlKDK>%1nm^3|OxLOLH8bQCh&ZoceqF44j@nSCaTf@_R0vPZx`O#q0BKi&x}DqZ-kH
zFl_eF@Nj~Gg#n9)?8eoEE0Te0&u~XXu2hzl*v|U)*Z;JfHA9=X7i-PJ!XX-d9b({d
zCk=GSLAned9ke;+LMg81MMag0l^jg^j<%ZRg^iI^J!pGuhBf-DnzLHpv@=w_>I|A!
zmK?AUvA`AVrX>`BJH9advM&MOPSCh5+Cvzo@h2x|)Yu+{BHV#{uA>l44#Ea)f#-1=
z?i2&?sM`*`?jTHB8JG+^p~`uXZm&Xh1hFwk{Wte%GvTj^G#aYDK+O|`H<@EQ=AJNz
zv>*nxH~nm_&ju5{@4?g3oc6S{Su0hedMnFThz{9cDR%^-1Njy+OSq-xVQ8;3*$~S{
zR+eVAR-@&bF3N^$V|QB;BgddamI^8-V_%8cD6s<^AsR4um)j^S!O7ei9mq7#?xuf`
zCbm*R7MsS_NyX~f8g@}GX!Zra)GUQjk_|fp8%G&!RisI+uLph%9Mcn`!G0jO8^N?n
zVE2&~nPh5DgrNjl^Pdc0t#GT@<DdFHS_O(6kAeda#=<b?3&7VQR1XU>^)LiGTr0O(
zR0*sL%ixq7`hy3wo|97qYl94Y5egFc&0qo+{D_TMVScC+)`O?pc+en!7hD`<F;NFi
zctrRF>ufIwNlgP=s*uizf|^Zpidde7SS$+BLz5smF?^VZ4Lb|fAs&m!QxvTB4%deA
z%}E0k9pJr&@M^~*TM%-YvT8`G<a6oihuux-)x{_dpSye@`rJB#l-5AEk8zd0Hg(L+
zmQi@NFT#Y}SnX~kH`)B|p&Gln&0gC<4kSs<#z6Eq3!BzSSO`1d>aYWrtwBOA_~Ce!
zG=L0~!_DEx!wR@!K5#|C@bkU^NRi2Hzo_pcbEFq|aPV&Fap;|IDW6`lEm}(Wx_06g
zJQ_)9X%g?Vcr#sg@4T6GZ#iF4c=4QZGqvIMv%hmrzXS#hmNex(Tal+mqp|eX8l$Z1
zx~Qk2huwW1)dw~s4!CvF1^2BMc#7;Yj^X-vq%MrQD3rxHsHTD-`NQxs!NOXEhJRUX
zo<CfFnRr1%6s6+6m#KG89H5LB=$>%YXHMO7G~*d@8^2c%#!{vZ<ot9&Y>ncrIe1%m
zKfWIUC7I`9NLATH$Ynfc9Ph(N;2Lwf$qcKazt4(q<c8EtO%Gy%Ik5+BC?2@4{QgjS
zPQeAmVIyg17X{2K0b;31tDP2{M5)!MhO~FoPXqE$`jXn;iI_%b;kyg-G+CB#zJ>XK
za(59-TcchV|E~XWzG#P4iKvj3Y$aH~_{J%!--g3!u~;c(Dw4_Ge9<WL;PQv{yO%zr
z;O?bLJ^R)t)NmWxf#@?5ukuCpOlCH|-P?I3yR-wZiwberhBpx`*&doy%%#nhbcM{5
zOt+Z`j+jWs+d~d$DK`9evBUb6X|05UC}ip<=fAg@6LI+Gos$r{ez=?XVvht_EUTFr
z1uiW59I>p4Oy>)w^bAxM51JEcC@mhhYbDq95~ppW<68b%g@E>trc4c5<;bfmp49#T
z$+JRQQVMwakwEb%+*lmZh=DzqWU`z&k%GbNN8q(<!(F5`x<1O4DM(-QQRDDz@o*QW
zr2VsPWJ(P7SjN;O28QWQPBpU8Ie{2IHAW&Y5znc!@kIQUq>1dI5a(1bpB98nQ61HS
zL~o+E0gH{L_J*akMa1(lE*2f*_Qb`aCXIgN8-}l6hRD0#WAZtb69uI#7PS`c{rW$#
CNM=z0

diff --git a/drivers/misc/mediatek/gpio/aeon_gpio.c b/drivers/misc/mediatek/gpio/aeon_gpio.c
index 9935203..756bd9f 100755
--- a/drivers/misc/mediatek/gpio/aeon_gpio.c
+++ b/drivers/misc/mediatek/gpio/aeon_gpio.c
@@ -148,6 +148,66 @@ unsigned int aeon_get_pwm_num(const char *name)
 }

 EXPORT_SYMBOL_GPL(aeon_get_pwm_num);

 

+#define CHG_CTL             9

+#define CHG_EN              3

+#define CHG_STAT            1

+#define METER_CTL           0

+#define METER_RESERV        11

+#define NLS_RST             7

+#define NLS_TRIG            8

+#define PINGOPIN_EN         5

+//#define PWR_PA

+#define PWR_PINGOPIN        83

+#define PWR_UART            6

+#define UART_EN             4

+

+void custom_gpio_init(void)

+{

+    gpio_request(CHG_CTL, "chg_ctl");

+    mt_set_gpio_dir(CHG_CTL, 1);

+    gpio_export_with_name(CHG_CTL, true, "chg_ctl");

+    

+    gpio_request(CHG_EN, "chg_en");

+    mt_set_gpio_dir(CHG_EN, 1);

+    gpio_export_with_name(CHG_EN, true, "chg_en");

+    

+    gpio_request(CHG_STAT, "chg_stat");

+    mt_set_gpio_dir(CHG_STAT, 1);

+    gpio_export_with_name(CHG_STAT, true, "chg_stat");

+    

+    gpio_request(METER_CTL, "meter_ctl");

+    mt_set_gpio_dir(METER_CTL, 1);

+    gpio_export_with_name(METER_CTL, true, "meter_ctl");

+

+    gpio_request(METER_RESERV, "meter_reserv");

+    mt_set_gpio_dir(METER_RESERV, 1);

+    gpio_export_with_name(METER_RESERV, true, "meter_reserv");

+

+    gpio_request(NLS_RST, "nls_rst");

+    mt_set_gpio_dir(NLS_RST, 1);

+    gpio_export_with_name(NLS_RST, true, "nls_rst");                

+    

+    gpio_request(NLS_TRIG, "nls_trig");

+    mt_set_gpio_dir(NLS_TRIG, 1);

+    gpio_export_with_name(NLS_TRIG, true, "nls_trig");

+    

+    gpio_request(PINGOPIN_EN, "pingopin_en");

+    mt_set_gpio_dir(PINGOPIN_EN, 1);

+    gpio_export_with_name(PINGOPIN_EN, true, "pingopin_en");

+    

+    gpio_request(PWR_PINGOPIN, "pwr_pingopin");

+    mt_set_gpio_dir(PWR_PINGOPIN, 1);

+    gpio_export_with_name(PWR_PINGOPIN, true, "pwr_pingopin");

+    

+    gpio_request(PWR_UART, "pwr_uart");

+    mt_set_gpio_dir(PWR_UART, 1);

+    gpio_export_with_name(PWR_UART, true, "pwr_uart"); 

+    

+    gpio_request(UART_EN, "uart_en");

+    mt_set_gpio_dir(UART_EN, 1);

+    gpio_export_with_name(UART_EN, true, "uart_en");                   

+}

+

 static int aeon_gpio_probe(struct platform_device *pdev)

 {

 	int ret = 0;

@@ -161,6 +221,9 @@ static int aeon_gpio_probe(struct platform_device *pdev)
 		AEON_ERR("%s : Cannot find gpio pinctrl!\n", __func__);

 	}

 

+printk("Jason in func:%s\n", __func__);

+    custom_gpio_init();

+

 	return ret;

 }

 

@@ -220,4 +283,4 @@ module_exit(eastaeon_gpio_exit);
 

 //MODULE_DESCRIPTION("eastaeon gpio driver");

 //MODULE_AUTHOR("sanford lin <lin.xiufa@eastaeon.com>");

-//MODULE_LICENSE("GPL");
\ No newline at end of file
+//MODULE_LICENSE("GPL");

diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h
index d38a294..ccdbe49 100644
--- a/include/asm-generic/gpio.h
+++ b/include/asm-generic/gpio.h
@@ -113,7 +113,8 @@ static inline int __gpio_to_irq(unsigned gpio)
 extern int gpio_request_one(unsigned gpio, unsigned long flags, const char *label);
 extern int gpio_request_array(const struct gpio *array, size_t num);
 extern void gpio_free_array(const struct gpio *array, size_t num);
-
+extern int gpiod_export_with_name(struct gpio_desc *desc, bool direction_may_change,
+                                    const char *name);
 /*
  * A sysfs interface can be exported by individual drivers if they want,
  * but more typically is configured entirely from userspace.
@@ -123,6 +124,12 @@ static inline int gpio_export(unsigned gpio, bool direction_may_change)
 	return gpiod_export(gpio_to_desc(gpio), direction_may_change);
 }
 
+static inline int gpio_export_with_name(unsigned gpio, bool direction_may_change,
+                                        const char *name)
+{
+	return gpiod_export_with_name(gpio_to_desc(gpio), direction_may_change, name);
+}
+
 static inline int gpio_export_link(struct device *dev, const char *name,
 				   unsigned gpio)
 {
diff --git a/include/linux/gpio.h b/include/linux/gpio.h
index 85aa5d0..a43c7e6 100644
--- a/include/linux/gpio.h
+++ b/include/linux/gpio.h
@@ -188,6 +188,14 @@ static inline int gpio_export(unsigned gpio, bool direction_may_change)
 	return -EINVAL;
 }
 
+static inline int gpio_export_with_name(unsigned gpio, bool direction_may_change,
+                                        const char *name)
+{
+	/* GPIO can never have been requested or set as {in,out}put */
+	WARN_ON(1);
+	return -EINVAL;
+}
+
 static inline int gpio_export_link(struct device *dev, const char *name,
 				unsigned gpio)
 {
diff --git a/tools/dct/old_dct/Keypad_YuSu.cmp b/tools/dct/old_dct/Keypad_YuSu.cmp
index 0986f7e..b63e689 100644
--- a/tools/dct/old_dct/Keypad_YuSu.cmp
+++ b/tools/dct/old_dct/Keypad_YuSu.cmp
@@ -67,7 +67,7 @@ KEY_W
 KEY_X
 KEY_Y
 KEY_Z
-
+KEY_F14
 [Key_code]
 0
 228
-- 
1.9.1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值