129e9ead2SNishad Kamdar /* SPDX-License-Identifier: GPL-2.0 */ 24b1a577dSLaurent Pinchart /* 34b1a577dSLaurent Pinchart * Driver for the NXP ISP1760 chip 44b1a577dSLaurent Pinchart * 5*60d789f3SRui Miguel Silva * Copyright 2021 Linaro, Rui Miguel Silva 64b1a577dSLaurent Pinchart * Copyright 2014 Laurent Pinchart 74b1a577dSLaurent Pinchart * Copyright 2007 Sebastian Siewior 84b1a577dSLaurent Pinchart * 94b1a577dSLaurent Pinchart * Contacts: 104b1a577dSLaurent Pinchart * Sebastian Siewior <bigeasy@linutronix.de> 114b1a577dSLaurent Pinchart * Laurent Pinchart <laurent.pinchart@ideasonboard.com> 12*60d789f3SRui Miguel Silva * Rui Miguel Silva <rui.silva@linaro.org> 134b1a577dSLaurent Pinchart */ 144b1a577dSLaurent Pinchart 154b1a577dSLaurent Pinchart #ifndef _ISP1760_CORE_H_ 164b1a577dSLaurent Pinchart #define _ISP1760_CORE_H_ 174b1a577dSLaurent Pinchart 184b1a577dSLaurent Pinchart #include <linux/ioport.h> 191da9e1c0SRui Miguel Silva #include <linux/regmap.h> 204b1a577dSLaurent Pinchart 214b1a577dSLaurent Pinchart #include "isp1760-hcd.h" 220316ca63SLaurent Pinchart #include "isp1760-udc.h" 234b1a577dSLaurent Pinchart 245171446aSLaurent Pinchart struct device; 255171446aSLaurent Pinchart struct gpio_desc; 265171446aSLaurent Pinchart 275171446aSLaurent Pinchart /* 285171446aSLaurent Pinchart * Device flags that can vary from board to board. All of these 295171446aSLaurent Pinchart * indicate the most "atypical" case, so that a devflags of 0 is 305171446aSLaurent Pinchart * a sane default configuration. 315171446aSLaurent Pinchart */ 325171446aSLaurent Pinchart #define ISP1760_FLAG_BUS_WIDTH_16 0x00000002 /* 16-bit data bus width */ 333eb96e04SRui Miguel Silva #define ISP1760_FLAG_PERIPHERAL_EN 0x00000004 /* Port 1 supports Peripheral mode*/ 345171446aSLaurent Pinchart #define ISP1760_FLAG_ANALOG_OC 0x00000008 /* Analog overcurrent */ 355171446aSLaurent Pinchart #define ISP1760_FLAG_DACK_POL_HIGH 0x00000010 /* DACK active high */ 365171446aSLaurent Pinchart #define ISP1760_FLAG_DREQ_POL_HIGH 0x00000020 /* DREQ active high */ 375171446aSLaurent Pinchart #define ISP1760_FLAG_ISP1761 0x00000040 /* Chip is ISP1761 */ 385171446aSLaurent Pinchart #define ISP1760_FLAG_INTR_POL_HIGH 0x00000080 /* Interrupt polarity active high */ 395171446aSLaurent Pinchart #define ISP1760_FLAG_INTR_EDGE_TRIG 0x00000100 /* Interrupt edge triggered */ 40*60d789f3SRui Miguel Silva #define ISP1760_FLAG_ISP1763 0x00000200 /* Chip is ISP1763 */ 41*60d789f3SRui Miguel Silva #define ISP1760_FLAG_BUS_WIDTH_8 0x00000400 /* 8-bit data bus width */ 425171446aSLaurent Pinchart 434b1a577dSLaurent Pinchart struct isp1760_device { 445171446aSLaurent Pinchart struct device *dev; 455171446aSLaurent Pinchart 465171446aSLaurent Pinchart unsigned int devflags; 475171446aSLaurent Pinchart struct gpio_desc *rst_gpio; 484b1a577dSLaurent Pinchart 494b1a577dSLaurent Pinchart struct isp1760_hcd hcd; 500316ca63SLaurent Pinchart struct isp1760_udc udc; 514b1a577dSLaurent Pinchart }; 524b1a577dSLaurent Pinchart 534b1a577dSLaurent Pinchart int isp1760_register(struct resource *mem, int irq, unsigned long irqflags, 544b1a577dSLaurent Pinchart struct device *dev, unsigned int devflags); 554b1a577dSLaurent Pinchart void isp1760_unregister(struct device *dev); 564b1a577dSLaurent Pinchart 570316ca63SLaurent Pinchart void isp1760_set_pullup(struct isp1760_device *isp, bool enable); 580316ca63SLaurent Pinchart 591da9e1c0SRui Miguel Silva static inline u32 isp1760_field_read(struct regmap_field **fields, u32 field) 605171446aSLaurent Pinchart { 611da9e1c0SRui Miguel Silva unsigned int val; 621da9e1c0SRui Miguel Silva 631da9e1c0SRui Miguel Silva regmap_field_read(fields[field], &val); 641da9e1c0SRui Miguel Silva 651da9e1c0SRui Miguel Silva return val; 665171446aSLaurent Pinchart } 675171446aSLaurent Pinchart 681da9e1c0SRui Miguel Silva static inline void isp1760_field_write(struct regmap_field **fields, u32 field, 691da9e1c0SRui Miguel Silva u32 val) 705171446aSLaurent Pinchart { 711da9e1c0SRui Miguel Silva regmap_field_write(fields[field], val); 725171446aSLaurent Pinchart } 735171446aSLaurent Pinchart 741da9e1c0SRui Miguel Silva static inline void isp1760_field_set(struct regmap_field **fields, u32 field) 751da9e1c0SRui Miguel Silva { 761da9e1c0SRui Miguel Silva isp1760_field_write(fields, field, 0xFFFFFFFF); 771da9e1c0SRui Miguel Silva } 781da9e1c0SRui Miguel Silva 791da9e1c0SRui Miguel Silva static inline void isp1760_field_clear(struct regmap_field **fields, u32 field) 801da9e1c0SRui Miguel Silva { 811da9e1c0SRui Miguel Silva isp1760_field_write(fields, field, 0); 821da9e1c0SRui Miguel Silva } 831da9e1c0SRui Miguel Silva 841da9e1c0SRui Miguel Silva static inline u32 isp1760_reg_read(struct regmap *regs, u32 reg) 851da9e1c0SRui Miguel Silva { 861da9e1c0SRui Miguel Silva unsigned int val; 871da9e1c0SRui Miguel Silva 881da9e1c0SRui Miguel Silva regmap_read(regs, reg, &val); 891da9e1c0SRui Miguel Silva 901da9e1c0SRui Miguel Silva return val; 911da9e1c0SRui Miguel Silva } 921da9e1c0SRui Miguel Silva 931da9e1c0SRui Miguel Silva static inline void isp1760_reg_write(struct regmap *regs, u32 reg, u32 val) 941da9e1c0SRui Miguel Silva { 951da9e1c0SRui Miguel Silva regmap_write(regs, reg, val); 961da9e1c0SRui Miguel Silva } 974b1a577dSLaurent Pinchart #endif 98